summaryrefslogtreecommitdiffstats
path: root/src/interfaces/ecpg/preproc/preproc.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/ecpg/preproc/preproc.y')
-rw-r--r--src/interfaces/ecpg/preproc/preproc.y18828
1 files changed, 18828 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
new file mode 100644
index 0000000..458ae68
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -0,0 +1,18828 @@
+/* header */
+/* src/interfaces/ecpg/preproc/ecpg.header */
+
+/* Copyright comment */
+%{
+#include "postgres_fe.h"
+
+#include "preproc_extern.h"
+#include "ecpg_config.h"
+#include <unistd.h>
+
+/* Location tracking support --- simpler than bison's default */
+#define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do { \
+ if (N) \
+ (Current) = (Rhs)[1]; \
+ else \
+ (Current) = (Rhs)[0]; \
+ } while (0)
+
+/*
+ * The %name-prefix option below will make bison call base_yylex, but we
+ * really want it to call filtered_base_yylex (see parser.c).
+ */
+#define base_yylex filtered_base_yylex
+
+/*
+ * This is only here so the string gets into the POT. Bison uses it
+ * internally.
+ */
+#define bison_gettext_dummy gettext_noop("syntax error")
+
+/*
+ * Variables containing simple states.
+ */
+int struct_level = 0;
+int braces_open; /* brace level counter */
+char *current_function;
+int ecpg_internal_var = 0;
+char *connection = NULL;
+char *input_filename = NULL;
+
+static int FoundInto = 0;
+static int initializer = 0;
+static int pacounter = 1;
+static char pacounter_buffer[sizeof(int) * CHAR_BIT * 10 / 3]; /* a rough guess at the size we need */
+static struct this_type actual_type[STRUCT_DEPTH];
+static char *actual_startline[STRUCT_DEPTH];
+static int varchar_counter = 1;
+static int bytea_counter = 1;
+
+/* temporarily store struct members while creating the data structure */
+struct ECPGstruct_member *struct_member_list[STRUCT_DEPTH] = { NULL };
+
+/* also store struct type so we can do a sizeof() later */
+static char *ECPGstruct_sizeof = NULL;
+
+/* for forward declarations we have to store some data as well */
+static char *forward_name = NULL;
+
+struct ECPGtype ecpg_no_indicator = {ECPGt_NO_INDICATOR, NULL, NULL, NULL, {NULL}, 0};
+struct variable no_indicator = {"no_indicator", &ecpg_no_indicator, 0, NULL};
+
+static struct ECPGtype ecpg_query = {ECPGt_char_variable, NULL, NULL, NULL, {NULL}, 0};
+
+static void vmmerror(int error_code, enum errortype type, const char *error, va_list ap) pg_attribute_printf(3, 0);
+
+static bool check_declared_list(const char*);
+
+/*
+ * Handle parsing errors and warnings
+ */
+static void
+vmmerror(int error_code, enum errortype type, const char *error, va_list ap)
+{
+ /* localize the error message string */
+ error = _(error);
+
+ fprintf(stderr, "%s:%d: ", input_filename, base_yylineno);
+
+ switch(type)
+ {
+ case ET_WARNING:
+ fprintf(stderr, _("WARNING: "));
+ break;
+ case ET_ERROR:
+ fprintf(stderr, _("ERROR: "));
+ break;
+ }
+
+ vfprintf(stderr, error, ap);
+
+ fprintf(stderr, "\n");
+
+ switch(type)
+ {
+ case ET_WARNING:
+ break;
+ case ET_ERROR:
+ ret_value = error_code;
+ break;
+ }
+}
+
+void
+mmerror(int error_code, enum errortype type, const char *error, ...)
+{
+ va_list ap;
+
+ va_start(ap, error);
+ vmmerror(error_code, type, error, ap);
+ va_end(ap);
+}
+
+void
+mmfatal(int error_code, const char *error, ...)
+{
+ va_list ap;
+
+ va_start(ap, error);
+ vmmerror(error_code, ET_ERROR, error, ap);
+ va_end(ap);
+
+ if (base_yyin)
+ fclose(base_yyin);
+ if (base_yyout)
+ fclose(base_yyout);
+
+ if (strcmp(output_filename, "-") != 0 && unlink(output_filename) != 0)
+ fprintf(stderr, _("could not remove output file \"%s\"\n"), output_filename);
+ exit(error_code);
+}
+
+/*
+ * string concatenation
+ */
+
+static char *
+cat2_str(char *str1, char *str2)
+{
+ char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 2);
+
+ strcpy(res_str, str1);
+ if (strlen(str1) != 0 && strlen(str2) != 0)
+ strcat(res_str, " ");
+ strcat(res_str, str2);
+ free(str1);
+ free(str2);
+ return res_str;
+}
+
+static char *
+cat_str(int count, ...)
+{
+ va_list args;
+ int i;
+ char *res_str;
+
+ va_start(args, count);
+
+ res_str = va_arg(args, char *);
+
+ /* now add all other strings */
+ for (i = 1; i < count; i++)
+ res_str = cat2_str(res_str, va_arg(args, char *));
+
+ va_end(args);
+
+ return res_str;
+}
+
+static char *
+make2_str(char *str1, char *str2)
+{
+ char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 1);
+
+ strcpy(res_str, str1);
+ strcat(res_str, str2);
+ free(str1);
+ free(str2);
+ return res_str;
+}
+
+static char *
+make3_str(char *str1, char *str2, char *str3)
+{
+ char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) +strlen(str3) + 1);
+
+ strcpy(res_str, str1);
+ strcat(res_str, str2);
+ strcat(res_str, str3);
+ free(str1);
+ free(str2);
+ free(str3);
+ return res_str;
+}
+
+/* and the rest */
+static char *
+make_name(void)
+{
+ return mm_strdup(base_yytext);
+}
+
+static char *
+create_questionmarks(char *name, bool array)
+{
+ struct variable *p = find_variable(name);
+ int count;
+ char *result = EMPTY;
+
+ /* In case we have a struct, we have to print as many "?" as there are attributes in the struct
+ * An array is only allowed together with an element argument
+ * This is essentially only used for inserts, but using a struct as input parameter is an error anywhere else
+ * so we don't have to worry here. */
+
+ if (p->type->type == ECPGt_struct || (array && p->type->type == ECPGt_array && p->type->u.element->type == ECPGt_struct))
+ {
+ struct ECPGstruct_member *m;
+
+ if (p->type->type == ECPGt_struct)
+ m = p->type->u.members;
+ else
+ m = p->type->u.element->u.members;
+
+ for (count = 0; m != NULL; m=m->next, count++);
+ }
+ else
+ count = 1;
+
+ for (; count > 0; count --)
+ {
+ sprintf(pacounter_buffer, "$%d", pacounter++);
+ result = cat_str(3, result, mm_strdup(pacounter_buffer), mm_strdup(" , "));
+ }
+
+ /* removed the trailing " ," */
+
+ result[strlen(result)-3] = '\0';
+ return result;
+}
+
+static char *
+adjust_outofscope_cursor_vars(struct cursor *cur)
+{
+ /* Informix accepts DECLARE with variables that are out of scope when OPEN is called.
+ * For instance you can DECLARE a cursor in one function, and OPEN/FETCH/CLOSE
+ * it in another functions. This is very useful for e.g. event-driver programming,
+ * but may also lead to dangerous programming. The limitation when this is allowed
+ * and doesn't cause problems have to be documented, like the allocated variables
+ * must not be realloc()'ed.
+ *
+ * We have to change the variables to our own struct and just store the pointer
+ * instead of the variable. Do it only for local variables, not for globals.
+ */
+
+ char *result = EMPTY;
+ int insert;
+
+ for (insert = 1; insert >= 0; insert--)
+ {
+ struct arguments *list;
+ struct arguments *ptr;
+ struct arguments *newlist = NULL;
+ struct variable *newvar, *newind;
+
+ list = (insert ? cur->argsinsert : cur->argsresult);
+
+ for (ptr = list; ptr != NULL; ptr = ptr->next)
+ {
+ char var_text[20];
+ char *original_var;
+ bool skip_set_var = false;
+ bool var_ptr = false;
+
+ /* change variable name to "ECPGget_var(<counter>)" */
+ original_var = ptr->variable->name;
+ sprintf(var_text, "%d))", ecpg_internal_var);
+
+ /* Don't emit ECPGset_var() calls for global variables */
+ if (ptr->variable->brace_level == 0)
+ {
+ newvar = ptr->variable;
+ skip_set_var = true;
+ }
+ else if ((ptr->variable->type->type == ECPGt_char_variable)
+ && (strncmp(ptr->variable->name, "ECPGprepared_statement", strlen("ECPGprepared_statement")) == 0))
+ {
+ newvar = ptr->variable;
+ skip_set_var = true;
+ }
+ else if ((ptr->variable->type->type != ECPGt_varchar
+ && ptr->variable->type->type != ECPGt_char
+ && ptr->variable->type->type != ECPGt_unsigned_char
+ && ptr->variable->type->type != ECPGt_string
+ && ptr->variable->type->type != ECPGt_bytea)
+ && atoi(ptr->variable->type->size) > 1)
+ {
+ newvar = new_variable(cat_str(4, mm_strdup("("),
+ mm_strdup(ecpg_type_name(ptr->variable->type->u.element->type)),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text)),
+ ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type,
+ mm_strdup("1"),
+ ptr->variable->type->u.element->counter),
+ ptr->variable->type->size),
+ 0);
+ }
+ else if ((ptr->variable->type->type == ECPGt_varchar
+ || ptr->variable->type->type == ECPGt_char
+ || ptr->variable->type->type == ECPGt_unsigned_char
+ || ptr->variable->type->type == ECPGt_string
+ || ptr->variable->type->type == ECPGt_bytea)
+ && atoi(ptr->variable->type->size) > 1)
+ {
+ newvar = new_variable(cat_str(4, mm_strdup("("),
+ mm_strdup(ecpg_type_name(ptr->variable->type->type)),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text)),
+ ECPGmake_simple_type(ptr->variable->type->type,
+ ptr->variable->type->size,
+ ptr->variable->type->counter),
+ 0);
+ if (ptr->variable->type->type == ECPGt_varchar ||
+ ptr->variable->type->type == ECPGt_bytea)
+ var_ptr = true;
+ }
+ else if (ptr->variable->type->type == ECPGt_struct
+ || ptr->variable->type->type == ECPGt_union)
+ {
+ newvar = new_variable(cat_str(5, mm_strdup("(*("),
+ mm_strdup(ptr->variable->type->type_name),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text),
+ mm_strdup(")")),
+ ECPGmake_struct_type(ptr->variable->type->u.members,
+ ptr->variable->type->type,
+ ptr->variable->type->type_name,
+ ptr->variable->type->struct_sizeof),
+ 0);
+ var_ptr = true;
+ }
+ else if (ptr->variable->type->type == ECPGt_array)
+ {
+ if (ptr->variable->type->u.element->type == ECPGt_struct
+ || ptr->variable->type->u.element->type == ECPGt_union)
+ {
+ newvar = new_variable(cat_str(5, mm_strdup("(*("),
+ mm_strdup(ptr->variable->type->u.element->type_name),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text),
+ mm_strdup(")")),
+ ECPGmake_struct_type(ptr->variable->type->u.element->u.members,
+ ptr->variable->type->u.element->type,
+ ptr->variable->type->u.element->type_name,
+ ptr->variable->type->u.element->struct_sizeof),
+ 0);
+ }
+ else
+ {
+ newvar = new_variable(cat_str(4, mm_strdup("("),
+ mm_strdup(ecpg_type_name(ptr->variable->type->u.element->type)),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text)),
+ ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type,
+ ptr->variable->type->u.element->size,
+ ptr->variable->type->u.element->counter),
+ ptr->variable->type->size),
+ 0);
+ var_ptr = true;
+ }
+ }
+ else
+ {
+ newvar = new_variable(cat_str(4, mm_strdup("*("),
+ mm_strdup(ecpg_type_name(ptr->variable->type->type)),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text)),
+ ECPGmake_simple_type(ptr->variable->type->type,
+ ptr->variable->type->size,
+ ptr->variable->type->counter),
+ 0);
+ var_ptr = true;
+ }
+
+ /* create call to "ECPGset_var(<counter>, <connection>, <pointer>. <line number>)" */
+ if (!skip_set_var)
+ {
+ sprintf(var_text, "%d, %s", ecpg_internal_var++, var_ptr ? "&(" : "(");
+ result = cat_str(5, result, mm_strdup("ECPGset_var("),
+ mm_strdup(var_text), mm_strdup(original_var),
+ mm_strdup("), __LINE__);\n"));
+ }
+
+ /* now the indicator if there is one and it's not a global variable */
+ if ((ptr->indicator->type->type == ECPGt_NO_INDICATOR) || (ptr->indicator->brace_level == 0))
+ {
+ newind = ptr->indicator;
+ }
+ else
+ {
+ /* change variable name to "ECPGget_var(<counter>)" */
+ original_var = ptr->indicator->name;
+ sprintf(var_text, "%d))", ecpg_internal_var);
+ var_ptr = false;
+
+ if (ptr->indicator->type->type == ECPGt_struct
+ || ptr->indicator->type->type == ECPGt_union)
+ {
+ newind = new_variable(cat_str(5, mm_strdup("(*("),
+ mm_strdup(ptr->indicator->type->type_name),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text),
+ mm_strdup(")")),
+ ECPGmake_struct_type(ptr->indicator->type->u.members,
+ ptr->indicator->type->type,
+ ptr->indicator->type->type_name,
+ ptr->indicator->type->struct_sizeof),
+ 0);
+ var_ptr = true;
+ }
+ else if (ptr->indicator->type->type == ECPGt_array)
+ {
+ if (ptr->indicator->type->u.element->type == ECPGt_struct
+ || ptr->indicator->type->u.element->type == ECPGt_union)
+ {
+ newind = new_variable(cat_str(5, mm_strdup("(*("),
+ mm_strdup(ptr->indicator->type->u.element->type_name),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text),
+ mm_strdup(")")),
+ ECPGmake_struct_type(ptr->indicator->type->u.element->u.members,
+ ptr->indicator->type->u.element->type,
+ ptr->indicator->type->u.element->type_name,
+ ptr->indicator->type->u.element->struct_sizeof),
+ 0);
+ }
+ else
+ {
+ newind = new_variable(cat_str(4, mm_strdup("("),
+ mm_strdup(ecpg_type_name(ptr->indicator->type->u.element->type)),
+ mm_strdup(" *)(ECPGget_var("), mm_strdup(var_text)),
+ ECPGmake_array_type(ECPGmake_simple_type(ptr->indicator->type->u.element->type,
+ ptr->indicator->type->u.element->size,
+ ptr->indicator->type->u.element->counter),
+ ptr->indicator->type->size),
+ 0);
+ var_ptr = true;
+ }
+ }
+ else if (atoi(ptr->indicator->type->size) > 1)
+ {
+ newind = new_variable(cat_str(4, mm_strdup("("),
+ mm_strdup(ecpg_type_name(ptr->indicator->type->type)),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text)),
+ ECPGmake_simple_type(ptr->indicator->type->type,
+ ptr->indicator->type->size,
+ ptr->variable->type->counter),
+ 0);
+ }
+ else
+ {
+ newind = new_variable(cat_str(4, mm_strdup("*("),
+ mm_strdup(ecpg_type_name(ptr->indicator->type->type)),
+ mm_strdup(" *)(ECPGget_var("),
+ mm_strdup(var_text)),
+ ECPGmake_simple_type(ptr->indicator->type->type,
+ ptr->indicator->type->size,
+ ptr->variable->type->counter),
+ 0);
+ var_ptr = true;
+ }
+
+ /* create call to "ECPGset_var(<counter>, <pointer>. <line number>)" */
+ sprintf(var_text, "%d, %s", ecpg_internal_var++, var_ptr ? "&(" : "(");
+ result = cat_str(5, result, mm_strdup("ECPGset_var("),
+ mm_strdup(var_text), mm_strdup(original_var),
+ mm_strdup("), __LINE__);\n"));
+ }
+
+ add_variable_to_tail(&newlist, newvar, newind);
+ }
+
+ if (insert)
+ cur->argsinsert_oos = newlist;
+ else
+ cur->argsresult_oos = newlist;
+ }
+
+ return result;
+}
+
+/* This tests whether the cursor was declared and opened in the same function. */
+#define SAMEFUNC(cur) \
+ ((cur->function == NULL) || \
+ (cur->function != NULL && strcmp(cur->function, current_function) == 0))
+
+static struct cursor *
+add_additional_variables(char *name, bool insert)
+{
+ struct cursor *ptr;
+ struct arguments *p;
+ int (* strcmp_fn)(const char *, const char *) = ((name[0] == ':' || name[0] == '"') ? strcmp : pg_strcasecmp);
+
+ for (ptr = cur; ptr != NULL; ptr=ptr->next)
+ {
+ if (strcmp_fn(ptr->name, name) == 0)
+ break;
+ }
+
+ if (ptr == NULL)
+ {
+ mmerror(PARSE_ERROR, ET_ERROR, "cursor \"%s\" does not exist", name);
+ return NULL;
+ }
+
+ if (insert)
+ {
+ /* add all those input variables that were given earlier
+ * note that we have to append here but have to keep the existing order */
+ for (p = (SAMEFUNC(ptr) ? ptr->argsinsert : ptr->argsinsert_oos); p; p = p->next)
+ add_variable_to_tail(&argsinsert, p->variable, p->indicator);
+ }
+
+ /* add all those output variables that were given earlier */
+ for (p = (SAMEFUNC(ptr) ? ptr->argsresult : ptr->argsresult_oos); p; p = p->next)
+ add_variable_to_tail(&argsresult, p->variable, p->indicator);
+
+ return ptr;
+}
+
+static void
+add_typedef(char *name, char *dimension, char *length, enum ECPGttype type_enum,
+ char *type_dimension, char *type_index, int initializer, int array)
+{
+ /* add entry to list */
+ struct typedefs *ptr, *this;
+
+ if ((type_enum == ECPGt_struct ||
+ type_enum == ECPGt_union) &&
+ initializer == 1)
+ mmerror(PARSE_ERROR, ET_ERROR, "initializer not allowed in type definition");
+ else if (INFORMIX_MODE && strcmp(name, "string") == 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "type name \"string\" is reserved in Informix mode");
+ else
+ {
+ for (ptr = types; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp(name, ptr->name) == 0)
+ /* re-definition is a bug */
+ mmerror(PARSE_ERROR, ET_ERROR, "type \"%s\" is already defined", name);
+ }
+ adjust_array(type_enum, &dimension, &length, type_dimension, type_index, array, true);
+
+ this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
+
+ /* initial definition */
+ this->next = types;
+ this->name = name;
+ this->brace_level = braces_open;
+ this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
+ this->type->type_enum = type_enum;
+ this->type->type_str = mm_strdup(name);
+ this->type->type_dimension = dimension; /* dimension of array */
+ this->type->type_index = length; /* length of string */
+ this->type->type_sizeof = ECPGstruct_sizeof;
+ this->struct_member_list = (type_enum == ECPGt_struct || type_enum == ECPGt_union) ?
+ ECPGstruct_member_dup(struct_member_list[struct_level]) : NULL;
+
+ if (type_enum != ECPGt_varchar &&
+ type_enum != ECPGt_bytea &&
+ type_enum != ECPGt_char &&
+ type_enum != ECPGt_unsigned_char &&
+ type_enum != ECPGt_string &&
+ atoi(this->type->type_index) >= 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "multidimensional arrays for simple data types are not supported");
+
+ types = this;
+ }
+}
+
+/*
+ * check an SQL identifier is declared or not.
+ * If it is already declared, the global variable
+ * connection will be changed to the related connection.
+ */
+static bool
+check_declared_list(const char *name)
+{
+ struct declared_list *ptr = NULL;
+ for (ptr = g_declared_list; ptr != NULL; ptr = ptr -> next)
+ {
+ if (!ptr->connection)
+ continue;
+ if (strcmp(name, ptr -> name) == 0)
+ {
+ if (connection && strcmp(ptr->connection, connection) != 0)
+ mmerror(PARSE_ERROR, ET_WARNING, "connection %s is overwritten with %s by DECLARE statement %s", connection, ptr->connection, name);
+ connection = mm_strdup(ptr -> connection);
+ return true;
+ }
+ }
+ return false;
+}
+%}
+
+%expect 0
+%name-prefix="base_yy"
+%locations
+
+%union {
+ double dval;
+ char *str;
+ int ival;
+ struct when action;
+ struct index index;
+ int tagname;
+ struct this_type type;
+ enum ECPGttype type_enum;
+ enum ECPGdtype dtype_enum;
+ struct fetch_desc descriptor;
+ struct su_symbol struct_union;
+ struct prep prep;
+ struct exec exec;
+ struct describe describe;
+}
+/* tokens */
+/* src/interfaces/ecpg/preproc/ecpg.tokens */
+
+/* special embedded SQL tokens */
+%token SQL_ALLOCATE SQL_AUTOCOMMIT SQL_BOOL SQL_BREAK
+ SQL_CARDINALITY SQL_CONNECT
+ SQL_COUNT
+ SQL_DATETIME_INTERVAL_CODE
+ SQL_DATETIME_INTERVAL_PRECISION SQL_DESCRIBE
+ SQL_DESCRIPTOR SQL_DISCONNECT SQL_FOUND
+ SQL_FREE SQL_GET SQL_GO SQL_GOTO SQL_IDENTIFIED
+ SQL_INDICATOR SQL_KEY_MEMBER SQL_LENGTH
+ SQL_LONG SQL_NULLABLE SQL_OCTET_LENGTH
+ SQL_OPEN SQL_OUTPUT SQL_REFERENCE
+ SQL_RETURNED_LENGTH SQL_RETURNED_OCTET_LENGTH SQL_SCALE
+ SQL_SECTION SQL_SHORT SQL_SIGNED SQL_SQLERROR
+ SQL_SQLPRINT SQL_SQLWARNING SQL_START SQL_STOP
+ SQL_STRUCT SQL_UNSIGNED SQL_VAR SQL_WHENEVER
+
+/* C tokens */
+%token S_ADD S_AND S_ANYTHING S_AUTO S_CONST S_DEC S_DIV
+ S_DOTPOINT S_EQUAL S_EXTERN S_INC S_LSHIFT S_MEMPOINT
+ S_MEMBER S_MOD S_MUL S_NEQUAL S_OR S_REGISTER S_RSHIFT
+ S_STATIC S_SUB S_VOLATILE
+ S_TYPEDEF
+
+%token CSTRING CVARIABLE CPP_LINE IP
+/* types */
+%type <str> toplevel_stmt
+%type <str> stmt
+%type <str> CallStmt
+%type <str> CreateRoleStmt
+%type <str> opt_with
+%type <str> OptRoleList
+%type <str> AlterOptRoleList
+%type <str> AlterOptRoleElem
+%type <str> CreateOptRoleElem
+%type <str> CreateUserStmt
+%type <str> AlterRoleStmt
+%type <str> opt_in_database
+%type <str> AlterRoleSetStmt
+%type <str> DropRoleStmt
+%type <str> CreateGroupStmt
+%type <str> AlterGroupStmt
+%type <str> add_drop
+%type <str> CreateSchemaStmt
+%type <str> OptSchemaName
+%type <str> OptSchemaEltList
+%type <str> schema_stmt
+%type <str> VariableSetStmt
+%type <str> set_rest
+%type <str> generic_set
+%type <str> set_rest_more
+%type <str> var_name
+%type <str> var_list
+%type <str> var_value
+%type <str> iso_level
+%type <str> opt_boolean_or_string
+%type <str> zone_value
+%type <str> opt_encoding
+%type <str> NonReservedWord_or_Sconst
+%type <str> VariableResetStmt
+%type <str> reset_rest
+%type <str> generic_reset
+%type <str> SetResetClause
+%type <str> FunctionSetResetClause
+%type <str> VariableShowStmt
+%type <str> ConstraintsSetStmt
+%type <str> constraints_set_list
+%type <str> constraints_set_mode
+%type <str> CheckPointStmt
+%type <str> DiscardStmt
+%type <str> AlterTableStmt
+%type <str> alter_table_cmds
+%type <str> partition_cmd
+%type <str> index_partition_cmd
+%type <str> alter_table_cmd
+%type <str> alter_column_default
+%type <str> opt_drop_behavior
+%type <str> opt_collate_clause
+%type <str> alter_using
+%type <str> replica_identity
+%type <str> reloptions
+%type <str> opt_reloptions
+%type <str> reloption_list
+%type <str> reloption_elem
+%type <str> alter_identity_column_option_list
+%type <str> alter_identity_column_option
+%type <str> PartitionBoundSpec
+%type <str> hash_partbound_elem
+%type <str> hash_partbound
+%type <str> AlterCompositeTypeStmt
+%type <str> alter_type_cmds
+%type <str> alter_type_cmd
+%type <str> ClosePortalStmt
+%type <str> CopyStmt
+%type <str> copy_from
+%type <str> opt_program
+%type <str> copy_file_name
+%type <str> copy_options
+%type <str> copy_opt_list
+%type <str> copy_opt_item
+%type <str> opt_binary
+%type <str> copy_delimiter
+%type <str> opt_using
+%type <str> copy_generic_opt_list
+%type <str> copy_generic_opt_elem
+%type <str> copy_generic_opt_arg
+%type <str> copy_generic_opt_arg_list
+%type <str> copy_generic_opt_arg_list_item
+%type <str> CreateStmt
+%type <str> OptTemp
+%type <str> OptTableElementList
+%type <str> OptTypedTableElementList
+%type <str> TableElementList
+%type <str> TypedTableElementList
+%type <str> TableElement
+%type <str> TypedTableElement
+%type <str> columnDef
+%type <str> columnOptions
+%type <str> column_compression
+%type <str> opt_column_compression
+%type <str> ColQualList
+%type <str> ColConstraint
+%type <str> ColConstraintElem
+%type <str> generated_when
+%type <str> ConstraintAttr
+%type <str> TableLikeClause
+%type <str> TableLikeOptionList
+%type <str> TableLikeOption
+%type <str> TableConstraint
+%type <str> ConstraintElem
+%type <str> opt_no_inherit
+%type <str> opt_column_list
+%type <str> columnList
+%type <str> columnElem
+%type <str> opt_c_include
+%type <str> key_match
+%type <str> ExclusionConstraintList
+%type <str> ExclusionConstraintElem
+%type <str> OptWhereClause
+%type <str> key_actions
+%type <str> key_update
+%type <str> key_delete
+%type <str> key_action
+%type <str> OptInherit
+%type <str> OptPartitionSpec
+%type <str> PartitionSpec
+%type <str> part_params
+%type <str> part_elem
+%type <str> table_access_method_clause
+%type <str> OptWith
+%type <str> OnCommitOption
+%type <str> OptTableSpace
+%type <str> OptConsTableSpace
+%type <str> ExistingIndex
+%type <str> CreateStatsStmt
+%type <str> stats_params
+%type <str> stats_param
+%type <str> AlterStatsStmt
+%type <str> create_as_target
+%type <str> opt_with_data
+%type <str> CreateMatViewStmt
+%type <str> create_mv_target
+%type <str> OptNoLog
+%type <str> RefreshMatViewStmt
+%type <str> CreateSeqStmt
+%type <str> AlterSeqStmt
+%type <str> OptSeqOptList
+%type <str> OptParenthesizedSeqOptList
+%type <str> SeqOptList
+%type <str> SeqOptElem
+%type <str> opt_by
+%type <str> NumericOnly
+%type <str> NumericOnly_list
+%type <str> CreatePLangStmt
+%type <str> opt_trusted
+%type <str> handler_name
+%type <str> opt_inline_handler
+%type <str> validator_clause
+%type <str> opt_validator
+%type <str> opt_procedural
+%type <str> CreateTableSpaceStmt
+%type <str> OptTableSpaceOwner
+%type <str> DropTableSpaceStmt
+%type <str> CreateExtensionStmt
+%type <str> create_extension_opt_list
+%type <str> create_extension_opt_item
+%type <str> AlterExtensionStmt
+%type <str> alter_extension_opt_list
+%type <str> alter_extension_opt_item
+%type <str> AlterExtensionContentsStmt
+%type <str> CreateFdwStmt
+%type <str> fdw_option
+%type <str> fdw_options
+%type <str> opt_fdw_options
+%type <str> AlterFdwStmt
+%type <str> create_generic_options
+%type <str> generic_option_list
+%type <str> alter_generic_options
+%type <str> alter_generic_option_list
+%type <str> alter_generic_option_elem
+%type <str> generic_option_elem
+%type <str> generic_option_name
+%type <str> generic_option_arg
+%type <str> CreateForeignServerStmt
+%type <str> opt_type
+%type <str> foreign_server_version
+%type <str> opt_foreign_server_version
+%type <str> AlterForeignServerStmt
+%type <str> CreateForeignTableStmt
+%type <str> ImportForeignSchemaStmt
+%type <str> import_qualification_type
+%type <str> import_qualification
+%type <str> CreateUserMappingStmt
+%type <str> auth_ident
+%type <str> DropUserMappingStmt
+%type <str> AlterUserMappingStmt
+%type <str> CreatePolicyStmt
+%type <str> AlterPolicyStmt
+%type <str> RowSecurityOptionalExpr
+%type <str> RowSecurityOptionalWithCheck
+%type <str> RowSecurityDefaultToRole
+%type <str> RowSecurityOptionalToRole
+%type <str> RowSecurityDefaultPermissive
+%type <str> RowSecurityDefaultForCmd
+%type <str> row_security_cmd
+%type <str> CreateAmStmt
+%type <str> am_type
+%type <str> CreateTrigStmt
+%type <str> TriggerActionTime
+%type <str> TriggerEvents
+%type <str> TriggerOneEvent
+%type <str> TriggerReferencing
+%type <str> TriggerTransitions
+%type <str> TriggerTransition
+%type <str> TransitionOldOrNew
+%type <str> TransitionRowOrTable
+%type <str> TransitionRelName
+%type <str> TriggerForSpec
+%type <str> TriggerForOptEach
+%type <str> TriggerForType
+%type <str> TriggerWhen
+%type <str> FUNCTION_or_PROCEDURE
+%type <str> TriggerFuncArgs
+%type <str> TriggerFuncArg
+%type <str> OptConstrFromTable
+%type <str> ConstraintAttributeSpec
+%type <str> ConstraintAttributeElem
+%type <str> CreateEventTrigStmt
+%type <str> event_trigger_when_list
+%type <str> event_trigger_when_item
+%type <str> event_trigger_value_list
+%type <str> AlterEventTrigStmt
+%type <str> enable_trigger
+%type <str> CreateAssertionStmt
+%type <str> DefineStmt
+%type <str> definition
+%type <str> def_list
+%type <str> def_elem
+%type <str> def_arg
+%type <str> old_aggr_definition
+%type <str> old_aggr_list
+%type <str> old_aggr_elem
+%type <str> opt_enum_val_list
+%type <str> enum_val_list
+%type <str> AlterEnumStmt
+%type <str> opt_if_not_exists
+%type <str> CreateOpClassStmt
+%type <str> opclass_item_list
+%type <str> opclass_item
+%type <str> opt_default
+%type <str> opt_opfamily
+%type <str> opclass_purpose
+%type <str> opt_recheck
+%type <str> CreateOpFamilyStmt
+%type <str> AlterOpFamilyStmt
+%type <str> opclass_drop_list
+%type <str> opclass_drop
+%type <str> DropOpClassStmt
+%type <str> DropOpFamilyStmt
+%type <str> DropOwnedStmt
+%type <str> ReassignOwnedStmt
+%type <str> DropStmt
+%type <str> object_type_any_name
+%type <str> object_type_name
+%type <str> drop_type_name
+%type <str> object_type_name_on_any_name
+%type <str> any_name_list
+%type <str> any_name
+%type <str> attrs
+%type <str> type_name_list
+%type <str> TruncateStmt
+%type <str> opt_restart_seqs
+%type <str> CommentStmt
+%type <str> comment_text
+%type <str> SecLabelStmt
+%type <str> opt_provider
+%type <str> security_label
+%type <str> FetchStmt
+%type <str> fetch_args
+%type <str> from_in
+%type <str> opt_from_in
+%type <str> GrantStmt
+%type <str> RevokeStmt
+%type <str> privileges
+%type <str> privilege_list
+%type <str> privilege
+%type <str> privilege_target
+%type <str> grantee_list
+%type <str> grantee
+%type <str> opt_grant_grant_option
+%type <str> GrantRoleStmt
+%type <str> RevokeRoleStmt
+%type <str> opt_grant_admin_option
+%type <str> opt_granted_by
+%type <str> AlterDefaultPrivilegesStmt
+%type <str> DefACLOptionList
+%type <str> DefACLOption
+%type <str> DefACLAction
+%type <str> defacl_privilege_target
+%type <str> IndexStmt
+%type <str> opt_unique
+%type <str> opt_concurrently
+%type <str> opt_index_name
+%type <str> access_method_clause
+%type <str> index_params
+%type <str> index_elem_options
+%type <str> index_elem
+%type <str> opt_include
+%type <str> index_including_params
+%type <str> opt_collate
+%type <str> opt_class
+%type <str> opt_asc_desc
+%type <str> opt_nulls_order
+%type <str> CreateFunctionStmt
+%type <str> opt_or_replace
+%type <str> func_args
+%type <str> func_args_list
+%type <str> function_with_argtypes_list
+%type <str> function_with_argtypes
+%type <str> func_args_with_defaults
+%type <str> func_args_with_defaults_list
+%type <str> func_arg
+%type <str> arg_class
+%type <str> param_name
+%type <str> func_return
+%type <str> func_type
+%type <str> func_arg_with_default
+%type <str> aggr_arg
+%type <str> aggr_args
+%type <str> aggr_args_list
+%type <str> aggregate_with_argtypes
+%type <str> aggregate_with_argtypes_list
+%type <str> opt_createfunc_opt_list
+%type <str> createfunc_opt_list
+%type <str> common_func_opt_item
+%type <str> createfunc_opt_item
+%type <str> func_as
+%type <str> ReturnStmt
+%type <str> opt_routine_body
+%type <str> routine_body_stmt_list
+%type <str> routine_body_stmt
+%type <str> transform_type_list
+%type <str> opt_definition
+%type <str> table_func_column
+%type <str> table_func_column_list
+%type <str> AlterFunctionStmt
+%type <str> alterfunc_opt_list
+%type <str> opt_restrict
+%type <str> RemoveFuncStmt
+%type <str> RemoveAggrStmt
+%type <str> RemoveOperStmt
+%type <str> oper_argtypes
+%type <str> any_operator
+%type <str> operator_with_argtypes_list
+%type <str> operator_with_argtypes
+%type <str> DoStmt
+%type <str> dostmt_opt_list
+%type <str> dostmt_opt_item
+%type <str> CreateCastStmt
+%type <str> cast_context
+%type <str> DropCastStmt
+%type <str> opt_if_exists
+%type <str> CreateTransformStmt
+%type <str> transform_element_list
+%type <str> DropTransformStmt
+%type <str> ReindexStmt
+%type <str> reindex_target_type
+%type <str> reindex_target_multitable
+%type <str> AlterTblSpcStmt
+%type <str> RenameStmt
+%type <str> opt_column
+%type <str> opt_set_data
+%type <str> AlterObjectDependsStmt
+%type <str> opt_no
+%type <str> AlterObjectSchemaStmt
+%type <str> AlterOperatorStmt
+%type <str> operator_def_list
+%type <str> operator_def_elem
+%type <str> operator_def_arg
+%type <str> AlterTypeStmt
+%type <str> AlterOwnerStmt
+%type <str> CreatePublicationStmt
+%type <str> opt_publication_for_tables
+%type <str> publication_for_tables
+%type <str> AlterPublicationStmt
+%type <str> CreateSubscriptionStmt
+%type <str> AlterSubscriptionStmt
+%type <str> DropSubscriptionStmt
+%type <str> RuleStmt
+%type <str> RuleActionList
+%type <str> RuleActionMulti
+%type <str> RuleActionStmt
+%type <str> RuleActionStmtOrEmpty
+%type <str> event
+%type <str> opt_instead
+%type <str> NotifyStmt
+%type <str> notify_payload
+%type <str> ListenStmt
+%type <str> UnlistenStmt
+%type <str> TransactionStmt
+%type <str> TransactionStmtLegacy
+%type <str> opt_transaction
+%type <str> transaction_mode_item
+%type <str> transaction_mode_list
+%type <str> transaction_mode_list_or_empty
+%type <str> opt_transaction_chain
+%type <str> ViewStmt
+%type <str> opt_check_option
+%type <str> LoadStmt
+%type <str> CreatedbStmt
+%type <str> createdb_opt_list
+%type <str> createdb_opt_items
+%type <str> createdb_opt_item
+%type <str> createdb_opt_name
+%type <str> opt_equal
+%type <str> AlterDatabaseStmt
+%type <str> AlterDatabaseSetStmt
+%type <str> DropdbStmt
+%type <str> drop_option_list
+%type <str> drop_option
+%type <str> AlterCollationStmt
+%type <str> AlterSystemStmt
+%type <str> CreateDomainStmt
+%type <str> AlterDomainStmt
+%type <str> opt_as
+%type <str> AlterTSDictionaryStmt
+%type <str> AlterTSConfigurationStmt
+%type <str> any_with
+%type <str> CreateConversionStmt
+%type <str> ClusterStmt
+%type <str> cluster_index_specification
+%type <str> VacuumStmt
+%type <str> AnalyzeStmt
+%type <str> utility_option_list
+%type <str> analyze_keyword
+%type <str> utility_option_elem
+%type <str> utility_option_name
+%type <str> utility_option_arg
+%type <str> opt_analyze
+%type <str> opt_verbose
+%type <str> opt_full
+%type <str> opt_freeze
+%type <str> opt_name_list
+%type <str> vacuum_relation
+%type <str> vacuum_relation_list
+%type <str> opt_vacuum_relation_list
+%type <str> ExplainStmt
+%type <str> ExplainableStmt
+%type <prep> PrepareStmt
+%type <str> prep_type_clause
+%type <str> PreparableStmt
+%type <exec> ExecuteStmt
+%type <str> execute_param_clause
+%type <str> InsertStmt
+%type <str> insert_target
+%type <str> insert_rest
+%type <str> override_kind
+%type <str> insert_column_list
+%type <str> insert_column_item
+%type <str> opt_on_conflict
+%type <str> opt_conf_expr
+%type <str> returning_clause
+%type <str> DeleteStmt
+%type <str> using_clause
+%type <str> LockStmt
+%type <str> opt_lock
+%type <str> lock_type
+%type <str> opt_nowait
+%type <str> opt_nowait_or_skip
+%type <str> UpdateStmt
+%type <str> set_clause_list
+%type <str> set_clause
+%type <str> set_target
+%type <str> set_target_list
+%type <str> DeclareCursorStmt
+%type <str> cursor_name
+%type <str> cursor_options
+%type <str> opt_hold
+%type <str> SelectStmt
+%type <str> select_with_parens
+%type <str> select_no_parens
+%type <str> select_clause
+%type <str> simple_select
+%type <str> with_clause
+%type <str> cte_list
+%type <str> common_table_expr
+%type <str> opt_materialized
+%type <str> opt_search_clause
+%type <str> opt_cycle_clause
+%type <str> opt_with_clause
+%type <str> into_clause
+%type <str> OptTempTableName
+%type <str> opt_table
+%type <str> set_quantifier
+%type <str> distinct_clause
+%type <str> opt_all_clause
+%type <str> opt_sort_clause
+%type <str> sort_clause
+%type <str> sortby_list
+%type <str> sortby
+%type <str> select_limit
+%type <str> opt_select_limit
+%type <str> limit_clause
+%type <str> offset_clause
+%type <str> select_limit_value
+%type <str> select_offset_value
+%type <str> select_fetch_first_value
+%type <str> I_or_F_const
+%type <str> row_or_rows
+%type <str> first_or_next
+%type <str> group_clause
+%type <str> group_by_list
+%type <str> group_by_item
+%type <str> empty_grouping_set
+%type <str> rollup_clause
+%type <str> cube_clause
+%type <str> grouping_sets_clause
+%type <str> having_clause
+%type <str> for_locking_clause
+%type <str> opt_for_locking_clause
+%type <str> for_locking_items
+%type <str> for_locking_item
+%type <str> for_locking_strength
+%type <str> locked_rels_list
+%type <str> values_clause
+%type <str> from_clause
+%type <str> from_list
+%type <str> table_ref
+%type <str> joined_table
+%type <str> alias_clause
+%type <str> opt_alias_clause
+%type <str> opt_alias_clause_for_join_using
+%type <str> func_alias_clause
+%type <str> join_type
+%type <str> opt_outer
+%type <str> join_qual
+%type <str> relation_expr
+%type <str> relation_expr_list
+%type <str> relation_expr_opt_alias
+%type <str> tablesample_clause
+%type <str> opt_repeatable_clause
+%type <str> func_table
+%type <str> rowsfrom_item
+%type <str> rowsfrom_list
+%type <str> opt_col_def_list
+%type <str> opt_ordinality
+%type <str> where_clause
+%type <str> where_or_current_clause
+%type <str> OptTableFuncElementList
+%type <str> TableFuncElementList
+%type <str> TableFuncElement
+%type <str> xmltable
+%type <str> xmltable_column_list
+%type <str> xmltable_column_el
+%type <str> xmltable_column_option_list
+%type <str> xmltable_column_option_el
+%type <str> xml_namespace_list
+%type <str> xml_namespace_el
+%type <str> Typename
+%type <index> opt_array_bounds
+%type <str> SimpleTypename
+%type <str> ConstTypename
+%type <str> GenericType
+%type <str> opt_type_modifiers
+%type <str> Numeric
+%type <str> opt_float
+%type <str> Bit
+%type <str> ConstBit
+%type <str> BitWithLength
+%type <str> BitWithoutLength
+%type <str> Character
+%type <str> ConstCharacter
+%type <str> CharacterWithLength
+%type <str> CharacterWithoutLength
+%type <str> character
+%type <str> opt_varying
+%type <str> ConstDatetime
+%type <str> ConstInterval
+%type <str> opt_timezone
+%type <str> opt_interval
+%type <str> interval_second
+%type <str> a_expr
+%type <str> b_expr
+%type <str> c_expr
+%type <str> func_application
+%type <str> func_expr
+%type <str> func_expr_windowless
+%type <str> func_expr_common_subexpr
+%type <str> xml_root_version
+%type <str> opt_xml_root_standalone
+%type <str> xml_attributes
+%type <str> xml_attribute_list
+%type <str> xml_attribute_el
+%type <str> document_or_content
+%type <str> xml_whitespace_option
+%type <str> xmlexists_argument
+%type <str> xml_passing_mech
+%type <str> within_group_clause
+%type <str> filter_clause
+%type <str> window_clause
+%type <str> window_definition_list
+%type <str> window_definition
+%type <str> over_clause
+%type <str> window_specification
+%type <str> opt_existing_window_name
+%type <str> opt_partition_clause
+%type <str> opt_frame_clause
+%type <str> frame_extent
+%type <str> frame_bound
+%type <str> opt_window_exclusion_clause
+%type <str> row
+%type <str> explicit_row
+%type <str> implicit_row
+%type <str> sub_type
+%type <str> all_Op
+%type <str> MathOp
+%type <str> qual_Op
+%type <str> qual_all_Op
+%type <str> subquery_Op
+%type <str> expr_list
+%type <str> func_arg_list
+%type <str> func_arg_expr
+%type <str> func_arg_list_opt
+%type <str> type_list
+%type <str> array_expr
+%type <str> array_expr_list
+%type <str> extract_list
+%type <str> extract_arg
+%type <str> unicode_normal_form
+%type <str> overlay_list
+%type <str> position_list
+%type <str> substr_list
+%type <str> trim_list
+%type <str> in_expr
+%type <str> case_expr
+%type <str> when_clause_list
+%type <str> when_clause
+%type <str> case_default
+%type <str> case_arg
+%type <str> columnref
+%type <str> indirection_el
+%type <str> opt_slice_bound
+%type <str> indirection
+%type <str> opt_indirection
+%type <str> opt_asymmetric
+%type <str> opt_target_list
+%type <str> target_list
+%type <str> target_el
+%type <str> qualified_name_list
+%type <str> qualified_name
+%type <str> name_list
+%type <str> name
+%type <str> attr_name
+%type <str> file_name
+%type <str> func_name
+%type <str> AexprConst
+%type <str> Iconst
+%type <str> SignedIconst
+%type <str> RoleId
+%type <str> RoleSpec
+%type <str> role_list
+%type <str> NonReservedWord
+%type <str> BareColLabel
+%type <str> unreserved_keyword
+%type <str> col_name_keyword
+%type <str> type_func_name_keyword
+%type <str> reserved_keyword
+%type <str> bare_label_keyword
+/* ecpgtype */
+/* src/interfaces/ecpg/preproc/ecpg.type */
+%type <str> ECPGAllocateDescr
+%type <str> ECPGCKeywords
+%type <str> ECPGColId
+%type <str> ECPGColLabel
+%type <str> ECPGColLabelCommon
+%type <str> ECPGConnect
+%type <str> ECPGCursorStmt
+%type <str> ECPGDeallocateDescr
+%type <str> ECPGDeclaration
+%type <str> ECPGDeclare
+%type <str> ECPGDeclareStmt
+%type <str> ECPGDisconnect
+%type <str> ECPGExecuteImmediateStmt
+%type <str> ECPGFree
+%type <str> ECPGGetDescHeaderItem
+%type <str> ECPGGetDescItem
+%type <str> ECPGGetDescriptorHeader
+%type <str> ECPGKeywords
+%type <str> ECPGKeywords_rest
+%type <str> ECPGKeywords_vanames
+%type <str> ECPGOpen
+%type <str> ECPGSetAutocommit
+%type <str> ECPGSetConnection
+%type <str> ECPGSetDescHeaderItem
+%type <str> ECPGSetDescItem
+%type <str> ECPGSetDescriptorHeader
+%type <str> ECPGTypeName
+%type <str> ECPGTypedef
+%type <str> ECPGVar
+%type <str> ECPGVarDeclaration
+%type <str> ECPGWhenever
+%type <str> ECPGunreserved_interval
+%type <str> UsingConst
+%type <str> UsingValue
+%type <str> all_unreserved_keyword
+%type <str> c_anything
+%type <str> c_args
+%type <str> c_list
+%type <str> c_stuff
+%type <str> c_stuff_item
+%type <str> c_term
+%type <str> c_thing
+%type <str> char_variable
+%type <str> char_civar
+%type <str> civar
+%type <str> civarind
+%type <str> ColId
+%type <str> ColLabel
+%type <str> connect_options
+%type <str> connection_object
+%type <str> connection_target
+%type <str> coutputvariable
+%type <str> cvariable
+%type <str> db_prefix
+%type <str> CreateAsStmt
+%type <str> DeallocateStmt
+%type <str> dis_name
+%type <str> ecpg_bconst
+%type <str> ecpg_fconst
+%type <str> ecpg_ident
+%type <str> ecpg_interval
+%type <str> ecpg_into
+%type <str> ecpg_fetch_into
+%type <str> ecpg_param
+%type <str> ecpg_sconst
+%type <str> ecpg_using
+%type <str> ecpg_xconst
+%type <str> enum_definition
+%type <str> enum_type
+%type <str> execstring
+%type <str> execute_rest
+%type <str> indicator
+%type <str> into_descriptor
+%type <str> into_sqlda
+%type <str> Iresult
+%type <str> on_off
+%type <str> opt_bit_field
+%type <str> opt_connection_name
+%type <str> opt_database_name
+%type <str> opt_ecpg_into
+%type <str> opt_ecpg_fetch_into
+%type <str> opt_ecpg_using
+%type <str> opt_initializer
+%type <str> opt_options
+%type <str> opt_output
+%type <str> opt_pointer
+%type <str> opt_port
+%type <str> opt_reference
+%type <str> opt_scale
+%type <str> opt_server
+%type <str> opt_user
+%type <str> opt_opt_value
+%type <str> ora_user
+%type <str> precision
+%type <str> prepared_name
+%type <str> quoted_ident_stringvar
+%type <str> s_struct_union
+%type <str> server
+%type <str> server_name
+%type <str> single_vt_declaration
+%type <str> storage_clause
+%type <str> storage_declaration
+%type <str> storage_modifier
+%type <str> struct_union_type
+%type <str> struct_union_type_with_symbol
+%type <str> symbol
+%type <str> type_declaration
+%type <str> type_function_name
+%type <str> user_name
+%type <str> using_descriptor
+%type <str> var_declaration
+%type <str> var_type_declarations
+%type <str> variable
+%type <str> variable_declarations
+%type <str> variable_list
+%type <str> vt_declarations
+
+%type <str> Op
+%type <str> IntConstVar
+%type <str> AllConstVar
+%type <str> CSTRING
+%type <str> CPP_LINE
+%type <str> CVARIABLE
+%type <str> BCONST
+%type <str> SCONST
+%type <str> XCONST
+%type <str> IDENT
+
+%type <struct_union> s_struct_union_symbol
+
+%type <descriptor> ECPGGetDescriptor
+%type <descriptor> ECPGSetDescriptor
+
+%type <type_enum> simple_type
+%type <type_enum> signed_type
+%type <type_enum> unsigned_type
+
+%type <dtype_enum> descriptor_item
+%type <dtype_enum> desc_header_item
+
+%type <type> var_type
+
+%type <action> action
+
+%type <describe> ECPGDescribe
+/* orig_tokens */
+ %token IDENT UIDENT FCONST SCONST USCONST BCONST XCONST Op
+ %token ICONST PARAM
+ %token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER
+ %token LESS_EQUALS GREATER_EQUALS NOT_EQUALS
+
+
+
+
+
+
+
+
+
+ %token ABORT_P ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER
+ AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC
+ ASENSITIVE ASSERTION ASSIGNMENT ASYMMETRIC ATOMIC AT ATTACH ATTRIBUTE AUTHORIZATION
+
+ BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
+ BOOLEAN_P BOTH BREADTH BY
+
+ CACHE CALL CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
+ CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
+ CLUSTER COALESCE COLLATE COLLATION COLUMN COLUMNS COMMENT COMMENTS COMMIT
+ COMMITTED COMPRESSION CONCURRENTLY CONFIGURATION CONFLICT
+ CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY
+ COST CREATE CROSS CSV CUBE CURRENT_P
+ CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA
+ CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
+
+ DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
+ DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DEPENDS DEPTH DESC
+ DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
+ DOUBLE_P DROP
+
+ EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
+ EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
+ EXTENSION EXTERNAL EXTRACT
+
+ FALSE_P FAMILY FETCH FILTER FINALIZE FIRST_P FLOAT_P FOLLOWING FOR
+ FORCE FOREIGN FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS
+
+ GENERATED GLOBAL GRANT GRANTED GREATEST GROUP_P GROUPING GROUPS
+
+ HANDLER HAVING HEADER_P HOLD HOUR_P
+
+ IDENTITY_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IMPORT_P IN_P INCLUDE
+ INCLUDING INCREMENT INDEX INDEXES INHERIT INHERITS INITIALLY INLINE_P
+ INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
+ INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
+
+ JOIN
+
+ KEY
+
+ LABEL LANGUAGE LARGE_P LAST_P LATERAL_P
+ LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL
+ LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOGGED
+
+ MAPPING MATCH MATERIALIZED MAXVALUE METHOD MINUTE_P MINVALUE MODE MONTH_P MOVE
+
+ NAME_P NAMES NATIONAL NATURAL NCHAR NEW NEXT NFC NFD NFKC NFKD NO NONE
+ NORMALIZE NORMALIZED
+ NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF
+ NULLS_P NUMERIC
+
+ OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OPTIONS OR
+ ORDER ORDINALITY OTHERS OUT_P OUTER_P
+ OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER
+
+ PARALLEL PARSER PARTIAL PARTITION PASSING PASSWORD PLACING PLANS POLICY
+ POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY
+ PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PUBLICATION
+
+ QUOTE
+
+ RANGE READ REAL REASSIGN RECHECK RECURSIVE REF REFERENCES REFERENCING
+ REFRESH REINDEX RELATIVE_P RELEASE RENAME REPEATABLE REPLACE REPLICA
+ RESET RESTART RESTRICT RETURN RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP
+ ROUTINE ROUTINES ROW ROWS RULE
+
+ SAVEPOINT SCHEMA SCHEMAS SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE SEQUENCES
+ SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF SHARE SHOW
+ SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SQL_P STABLE STANDALONE_P
+ START STATEMENT STATISTICS STDIN STDOUT STORAGE STORED STRICT_P STRIP_P
+ SUBSCRIPTION SUBSTRING SUPPORT SYMMETRIC SYSID SYSTEM_P
+
+ TABLE TABLES TABLESAMPLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN
+ TIES TIME TIMESTAMP TO TRAILING TRANSACTION TRANSFORM
+ TREAT TRIGGER TRIM TRUE_P
+ TRUNCATE TRUSTED TYPE_P TYPES_P
+
+ UESCAPE UNBOUNDED UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN
+ UNLISTEN UNLOGGED UNTIL UPDATE USER USING
+
+ VACUUM VALID VALIDATE VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING
+ VERBOSE VERSION_P VIEW VIEWS VOLATILE
+
+ WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WRAPPER WRITE
+
+ XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLNAMESPACES
+ XMLPARSE XMLPI XMLROOT XMLSERIALIZE XMLTABLE
+
+ YEAR_P YES_P
+
+ ZONE
+
+
+
+
+
+
+
+
+
+
+
+ %token NOT_LA NULLS_LA WITH_LA
+
+
+
+
+
+
+
+
+ %token MODE_TYPE_NAME
+ %token MODE_PLPGSQL_EXPR
+ %token MODE_PLPGSQL_ASSIGN1
+ %token MODE_PLPGSQL_ASSIGN2
+ %token MODE_PLPGSQL_ASSIGN3
+
+
+
+ %nonassoc SET
+ %left UNION EXCEPT
+ %left INTERSECT
+ %left OR
+ %left AND
+ %right NOT
+ %nonassoc IS ISNULL NOTNULL
+ %nonassoc '<' '>' '=' LESS_EQUALS GREATER_EQUALS NOT_EQUALS
+ %nonassoc BETWEEN IN_P LIKE ILIKE SIMILAR NOT_LA
+ %nonassoc ESCAPE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %nonassoc UNBOUNDED
+ %nonassoc IDENT
+%nonassoc CSTRING PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP
+ %left Op OPERATOR
+ %left '+' '-'
+ %left '*' '/' '%'
+ %left '^'
+
+ %left AT
+ %left COLLATE
+ %right UMINUS
+ %left '[' ']'
+ %left '(' ')'
+ %left TYPECAST
+ %left '.'
+
+
+
+
+
+
+
+ %left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
+
+%%
+prog: statements;
+/* rules */
+ toplevel_stmt:
+ stmt
+ {
+ $$ = $1;
+}
+| TransactionStmtLegacy
+ {
+ fprintf(base_yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
+ whenever_action(2);
+ free($1);
+ }
+;
+
+
+ stmt:
+ AlterEventTrigStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterCollationStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterDatabaseStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterDatabaseSetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterDefaultPrivilegesStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterDomainStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterEnumStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterExtensionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterExtensionContentsStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterFdwStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterForeignServerStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterFunctionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterGroupStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterObjectDependsStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterObjectSchemaStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterOwnerStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterOperatorStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterTypeStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterPolicyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterSeqStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterSystemStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterTableStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterTblSpcStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterCompositeTypeStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterPublicationStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterRoleSetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterRoleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterSubscriptionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterStatsStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterTSConfigurationStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterTSDictionaryStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterUserMappingStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AnalyzeStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CallStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CheckPointStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| ClosePortalStmt
+ {
+ if (INFORMIX_MODE)
+ {
+ if (pg_strcasecmp($1+strlen("close "), "database") == 0)
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement");
+
+ fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
+ whenever_action(2);
+ free($1);
+ break;
+ }
+ }
+
+ output_statement($1, 0, ECPGst_normal);
+ }
+| ClusterStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CommentStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| ConstraintsSetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CopyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateAmStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateAsStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateAssertionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateCastStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateConversionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateDomainStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateExtensionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateFdwStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateForeignServerStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateForeignTableStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateFunctionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateGroupStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateMatViewStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateOpClassStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateOpFamilyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreatePublicationStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| AlterOpFamilyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreatePolicyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreatePLangStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateSchemaStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateSeqStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateSubscriptionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateStatsStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateTableSpaceStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateTransformStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateTrigStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateEventTrigStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateRoleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateUserStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreateUserMappingStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| CreatedbStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DeallocateStmt
+ {
+ output_deallocate_prepare_statement($1);
+ }
+| DeclareCursorStmt
+ { output_simple_statement($1, (strncmp($1, "ECPGset_var", strlen("ECPGset_var")) == 0) ? 4 : 0); }
+| DefineStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DeleteStmt
+ { output_statement($1, 1, ECPGst_prepnormal); }
+| DiscardStmt
+ { output_statement($1, 1, ECPGst_normal); }
+| DoStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropCastStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropOpClassStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropOpFamilyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropOwnedStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropSubscriptionStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropTableSpaceStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropTransformStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropRoleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropUserMappingStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| DropdbStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| ExecuteStmt
+ {
+ check_declared_list($1.name);
+ if ($1.type == NULL || strlen($1.type) == 0)
+ output_statement($1.name, 1, ECPGst_execute);
+ else
+ {
+ if ($1.name[0] != '"')
+ /* case of char_variable */
+ add_variable_to_tail(&argsinsert, find_variable($1.name), &no_indicator);
+ else
+ {
+ /* case of ecpg_ident or CSTRING */
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ char *str = mm_strdup($1.name + 1);
+
+ /* It must be cut off double quotation because new_variable() double-quotes. */
+ str[strlen(str) - 1] = '\0';
+ sprintf(length, "%zu", strlen(str));
+ add_variable_to_tail(&argsinsert, new_variable(str, ECPGmake_simple_type(ECPGt_const, length, 0), 0), &no_indicator);
+ }
+ output_statement(cat_str(3, mm_strdup("execute"), mm_strdup("$0"), $1.type), 0, ECPGst_exec_with_exprlist);
+ }
+ }
+| ExplainStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| FetchStmt
+ { output_statement($1, 1, ECPGst_normal); }
+| GrantStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| GrantRoleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| ImportForeignSchemaStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| IndexStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| InsertStmt
+ { output_statement($1, 1, ECPGst_prepnormal); }
+| ListenStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| RefreshMatViewStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| LoadStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| LockStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| NotifyStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| PrepareStmt
+ {
+ check_declared_list($1.name);
+ if ($1.type == NULL)
+ output_prepare_statement($1.name, $1.stmt);
+ else if (strlen($1.type) == 0)
+ {
+ char *stmt = cat_str(3, mm_strdup("\""), $1.stmt, mm_strdup("\""));
+ output_prepare_statement($1.name, stmt);
+ }
+ else
+ {
+ if ($1.name[0] != '"')
+ /* case of char_variable */
+ add_variable_to_tail(&argsinsert, find_variable($1.name), &no_indicator);
+ else
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ char *str = mm_strdup($1.name + 1);
+
+ /* It must be cut off double quotation because new_variable() double-quotes. */
+ str[strlen(str) - 1] = '\0';
+ sprintf(length, "%zu", strlen(str));
+ add_variable_to_tail(&argsinsert, new_variable(str, ECPGmake_simple_type(ECPGt_const, length, 0), 0), &no_indicator);
+ }
+ output_statement(cat_str(5, mm_strdup("prepare"), mm_strdup("$0"), $1.type, mm_strdup("as"), $1.stmt), 0, ECPGst_prepare);
+ }
+ }
+| ReassignOwnedStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| ReindexStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| RemoveAggrStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| RemoveFuncStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| RemoveOperStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| RenameStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| RevokeStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| RevokeRoleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| RuleStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| SecLabelStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| SelectStmt
+ { output_statement($1, 1, ECPGst_prepnormal); }
+| TransactionStmt
+ {
+ fprintf(base_yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
+ whenever_action(2);
+ free($1);
+ }
+| TruncateStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| UnlistenStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| UpdateStmt
+ { output_statement($1, 1, ECPGst_prepnormal); }
+| VacuumStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| VariableResetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| VariableSetStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| VariableShowStmt
+ { output_statement($1, 0, ECPGst_normal); }
+| ViewStmt
+ { output_statement($1, 0, ECPGst_normal); }
+ | ECPGAllocateDescr
+ {
+ fprintf(base_yyout,"ECPGallocate_desc(__LINE__, %s);",$1);
+ whenever_action(0);
+ free($1);
+ }
+ | ECPGConnect
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CONNECT statement");
+
+ fprintf(base_yyout, "{ ECPGconnect(__LINE__, %d, %s, %d); ", compat, $1, autocommit);
+ reset_variables();
+ whenever_action(2);
+ free($1);
+ }
+ | ECPGDeclareStmt
+ {
+ output_simple_statement($1, 0);
+ }
+ | ECPGCursorStmt
+ {
+ output_simple_statement($1, (strncmp($1, "ECPGset_var", strlen("ECPGset_var")) == 0) ? 4 : 0);
+ }
+ | ECPGDeallocateDescr
+ {
+ fprintf(base_yyout,"ECPGdeallocate_desc(__LINE__, %s);",$1);
+ whenever_action(0);
+ free($1);
+ }
+ | ECPGDeclare
+ {
+ output_simple_statement($1, 0);
+ }
+ | ECPGDescribe
+ {
+ check_declared_list($1.stmt_name);
+
+ fprintf(base_yyout, "{ ECPGdescribe(__LINE__, %d, %d, %s, %s,", compat, $1.input, connection ? connection : "NULL", $1.stmt_name);
+ dump_variables(argsresult, 1);
+ fputs("ECPGt_EORT);", base_yyout);
+ fprintf(base_yyout, "}");
+ output_line_number();
+
+ free($1.stmt_name);
+ }
+ | ECPGDisconnect
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in DISCONNECT statement");
+
+ fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, %s);",
+ $1 ? $1 : "\"CURRENT\"");
+ whenever_action(2);
+ free($1);
+ }
+ | ECPGExecuteImmediateStmt { output_statement($1, 0, ECPGst_exec_immediate); }
+ | ECPGFree
+ {
+ const char *con = connection ? connection : "NULL";
+
+ if (strcmp($1, "all") == 0)
+ fprintf(base_yyout, "{ ECPGdeallocate_all(__LINE__, %d, %s);", compat, con);
+ else if ($1[0] == ':')
+ fprintf(base_yyout, "{ ECPGdeallocate(__LINE__, %d, %s, %s);", compat, con, $1+1);
+ else
+ fprintf(base_yyout, "{ ECPGdeallocate(__LINE__, %d, %s, \"%s\");", compat, con, $1);
+
+ whenever_action(2);
+ free($1);
+ }
+ | ECPGGetDescriptor
+ {
+ lookup_descriptor($1.name, connection);
+ output_get_descr($1.name, $1.str);
+ free($1.name);
+ free($1.str);
+ }
+ | ECPGGetDescriptorHeader
+ {
+ lookup_descriptor($1, connection);
+ output_get_descr_header($1);
+ free($1);
+ }
+ | ECPGOpen
+ {
+ struct cursor *ptr;
+
+ if ((ptr = add_additional_variables($1, true)) != NULL)
+ {
+ connection = ptr->connection ? mm_strdup(ptr->connection) : NULL;
+ output_statement(mm_strdup(ptr->command), 0, ECPGst_normal);
+ ptr->opened = true;
+ }
+ }
+ | ECPGSetAutocommit
+ {
+ fprintf(base_yyout, "{ ECPGsetcommit(__LINE__, \"%s\", %s);", $1, connection ? connection : "NULL");
+ whenever_action(2);
+ free($1);
+ }
+ | ECPGSetConnection
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in SET CONNECTION statement");
+
+ fprintf(base_yyout, "{ ECPGsetconn(__LINE__, %s);", $1);
+ whenever_action(2);
+ free($1);
+ }
+ | ECPGSetDescriptor
+ {
+ lookup_descriptor($1.name, connection);
+ output_set_descr($1.name, $1.str);
+ free($1.name);
+ free($1.str);
+ }
+ | ECPGSetDescriptorHeader
+ {
+ lookup_descriptor($1, connection);
+ output_set_descr_header($1);
+ free($1);
+ }
+ | ECPGTypedef
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in TYPE statement");
+
+ fprintf(base_yyout, "%s", $1);
+ free($1);
+ output_line_number();
+ }
+ | ECPGVar
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in VAR statement");
+
+ output_simple_statement($1, 0);
+ }
+ | ECPGWhenever
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in WHENEVER statement");
+
+ output_simple_statement($1, 0);
+ }
+|
+ { $$ = NULL; }
+;
+
+
+ CallStmt:
+ CALL func_application
+ {
+ $$ = cat_str(2,mm_strdup("call"),$2);
+}
+;
+
+
+ CreateRoleStmt:
+ CREATE ROLE RoleId opt_with OptRoleList
+ {
+ $$ = cat_str(4,mm_strdup("create role"),$3,$4,$5);
+}
+;
+
+
+ opt_with:
+ WITH
+ {
+ $$ = mm_strdup("with");
+}
+| WITH_LA
+ {
+ $$ = mm_strdup("with");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptRoleList:
+ OptRoleList CreateOptRoleElem
+ {
+ $$ = cat_str(2,$1,$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ AlterOptRoleList:
+ AlterOptRoleList AlterOptRoleElem
+ {
+ $$ = cat_str(2,$1,$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ AlterOptRoleElem:
+ PASSWORD ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("password"),$2);
+}
+| PASSWORD NULL_P
+ {
+ $$ = mm_strdup("password null");
+}
+| ENCRYPTED PASSWORD ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("encrypted password"),$3);
+}
+| UNENCRYPTED PASSWORD ecpg_sconst
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = cat_str(2,mm_strdup("unencrypted password"),$3);
+}
+| INHERIT
+ {
+ $$ = mm_strdup("inherit");
+}
+| CONNECTION LIMIT SignedIconst
+ {
+ $$ = cat_str(2,mm_strdup("connection limit"),$3);
+}
+| VALID UNTIL ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("valid until"),$3);
+}
+| USER role_list
+ {
+ $$ = cat_str(2,mm_strdup("user"),$2);
+}
+| ecpg_ident
+ {
+ $$ = $1;
+}
+;
+
+
+ CreateOptRoleElem:
+ AlterOptRoleElem
+ {
+ $$ = $1;
+}
+| SYSID Iconst
+ {
+ $$ = cat_str(2,mm_strdup("sysid"),$2);
+}
+| ADMIN role_list
+ {
+ $$ = cat_str(2,mm_strdup("admin"),$2);
+}
+| ROLE role_list
+ {
+ $$ = cat_str(2,mm_strdup("role"),$2);
+}
+| IN_P ROLE role_list
+ {
+ $$ = cat_str(2,mm_strdup("in role"),$3);
+}
+| IN_P GROUP_P role_list
+ {
+ $$ = cat_str(2,mm_strdup("in group"),$3);
+}
+;
+
+
+ CreateUserStmt:
+ CREATE USER RoleId opt_with OptRoleList
+ {
+ $$ = cat_str(4,mm_strdup("create user"),$3,$4,$5);
+}
+;
+
+
+ AlterRoleStmt:
+ ALTER ROLE RoleSpec opt_with AlterOptRoleList
+ {
+ $$ = cat_str(4,mm_strdup("alter role"),$3,$4,$5);
+}
+| ALTER USER RoleSpec opt_with AlterOptRoleList
+ {
+ $$ = cat_str(4,mm_strdup("alter user"),$3,$4,$5);
+}
+;
+
+
+ opt_in_database:
+
+ {
+ $$=EMPTY; }
+| IN_P DATABASE name
+ {
+ $$ = cat_str(2,mm_strdup("in database"),$3);
+}
+;
+
+
+ AlterRoleSetStmt:
+ ALTER ROLE RoleSpec opt_in_database SetResetClause
+ {
+ $$ = cat_str(4,mm_strdup("alter role"),$3,$4,$5);
+}
+| ALTER ROLE ALL opt_in_database SetResetClause
+ {
+ $$ = cat_str(3,mm_strdup("alter role all"),$4,$5);
+}
+| ALTER USER RoleSpec opt_in_database SetResetClause
+ {
+ $$ = cat_str(4,mm_strdup("alter user"),$3,$4,$5);
+}
+| ALTER USER ALL opt_in_database SetResetClause
+ {
+ $$ = cat_str(3,mm_strdup("alter user all"),$4,$5);
+}
+;
+
+
+ DropRoleStmt:
+ DROP ROLE role_list
+ {
+ $$ = cat_str(2,mm_strdup("drop role"),$3);
+}
+| DROP ROLE IF_P EXISTS role_list
+ {
+ $$ = cat_str(2,mm_strdup("drop role if exists"),$5);
+}
+| DROP USER role_list
+ {
+ $$ = cat_str(2,mm_strdup("drop user"),$3);
+}
+| DROP USER IF_P EXISTS role_list
+ {
+ $$ = cat_str(2,mm_strdup("drop user if exists"),$5);
+}
+| DROP GROUP_P role_list
+ {
+ $$ = cat_str(2,mm_strdup("drop group"),$3);
+}
+| DROP GROUP_P IF_P EXISTS role_list
+ {
+ $$ = cat_str(2,mm_strdup("drop group if exists"),$5);
+}
+;
+
+
+ CreateGroupStmt:
+ CREATE GROUP_P RoleId opt_with OptRoleList
+ {
+ $$ = cat_str(4,mm_strdup("create group"),$3,$4,$5);
+}
+;
+
+
+ AlterGroupStmt:
+ ALTER GROUP_P RoleSpec add_drop USER role_list
+ {
+ $$ = cat_str(5,mm_strdup("alter group"),$3,$4,mm_strdup("user"),$6);
+}
+;
+
+
+ add_drop:
+ ADD_P
+ {
+ $$ = mm_strdup("add");
+}
+| DROP
+ {
+ $$ = mm_strdup("drop");
+}
+;
+
+
+ CreateSchemaStmt:
+ CREATE SCHEMA OptSchemaName AUTHORIZATION RoleSpec OptSchemaEltList
+ {
+ $$ = cat_str(5,mm_strdup("create schema"),$3,mm_strdup("authorization"),$5,$6);
+}
+| CREATE SCHEMA ColId OptSchemaEltList
+ {
+ $$ = cat_str(3,mm_strdup("create schema"),$3,$4);
+}
+| CREATE SCHEMA IF_P NOT EXISTS OptSchemaName AUTHORIZATION RoleSpec OptSchemaEltList
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = cat_str(5,mm_strdup("create schema if not exists"),$6,mm_strdup("authorization"),$8,$9);
+}
+| CREATE SCHEMA IF_P NOT EXISTS ColId OptSchemaEltList
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = cat_str(3,mm_strdup("create schema if not exists"),$6,$7);
+}
+;
+
+
+ OptSchemaName:
+ ColId
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptSchemaEltList:
+ OptSchemaEltList schema_stmt
+ {
+ $$ = cat_str(2,$1,$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ schema_stmt:
+ CreateStmt
+ {
+ $$ = $1;
+}
+| IndexStmt
+ {
+ $$ = $1;
+}
+| CreateSeqStmt
+ {
+ $$ = $1;
+}
+| CreateTrigStmt
+ {
+ $$ = $1;
+}
+| GrantStmt
+ {
+ $$ = $1;
+}
+| ViewStmt
+ {
+ $$ = $1;
+}
+;
+
+
+ VariableSetStmt:
+ SET set_rest
+ {
+ $$ = cat_str(2,mm_strdup("set"),$2);
+}
+| SET LOCAL set_rest
+ {
+ $$ = cat_str(2,mm_strdup("set local"),$3);
+}
+| SET SESSION set_rest
+ {
+ $$ = cat_str(2,mm_strdup("set session"),$3);
+}
+;
+
+
+ set_rest:
+ TRANSACTION transaction_mode_list
+ {
+ $$ = cat_str(2,mm_strdup("transaction"),$2);
+}
+| SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
+ {
+ $$ = cat_str(2,mm_strdup("session characteristics as transaction"),$5);
+}
+| set_rest_more
+ {
+ $$ = $1;
+}
+;
+
+
+ generic_set:
+ var_name TO var_list
+ {
+ $$ = cat_str(3,$1,mm_strdup("to"),$3);
+}
+| var_name '=' var_list
+ {
+ $$ = cat_str(3,$1,mm_strdup("="),$3);
+}
+| var_name TO DEFAULT
+ {
+ $$ = cat_str(2,$1,mm_strdup("to default"));
+}
+| var_name '=' DEFAULT
+ {
+ $$ = cat_str(2,$1,mm_strdup("= default"));
+}
+;
+
+
+ set_rest_more:
+ generic_set
+ {
+ $$ = $1;
+}
+| var_name FROM CURRENT_P
+ {
+ $$ = cat_str(2,$1,mm_strdup("from current"));
+}
+| TIME ZONE zone_value
+ {
+ $$ = cat_str(2,mm_strdup("time zone"),$3);
+}
+| CATALOG_P ecpg_sconst
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = cat_str(2,mm_strdup("catalog"),$2);
+}
+| SCHEMA ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("schema"),$2);
+}
+| NAMES opt_encoding
+ {
+ $$ = cat_str(2,mm_strdup("names"),$2);
+}
+| ROLE NonReservedWord_or_Sconst
+ {
+ $$ = cat_str(2,mm_strdup("role"),$2);
+}
+| SESSION AUTHORIZATION NonReservedWord_or_Sconst
+ {
+ $$ = cat_str(2,mm_strdup("session authorization"),$3);
+}
+| SESSION AUTHORIZATION DEFAULT
+ {
+ $$ = mm_strdup("session authorization default");
+}
+| XML_P OPTION document_or_content
+ {
+ $$ = cat_str(2,mm_strdup("xml option"),$3);
+}
+| TRANSACTION SNAPSHOT ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("transaction snapshot"),$3);
+}
+;
+
+
+ var_name:
+ECPGColId
+ {
+ $$ = $1;
+}
+| var_name '.' ColId
+ {
+ $$ = cat_str(3,$1,mm_strdup("."),$3);
+}
+;
+
+
+ var_list:
+ var_value
+ {
+ $$ = $1;
+}
+| var_list ',' var_value
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ var_value:
+ opt_boolean_or_string
+ {
+ $$ = $1;
+}
+| NumericOnly
+ {
+ if ($1[0] == '$')
+ {
+ free($1);
+ $1 = mm_strdup("$0");
+ }
+
+ $$ = $1;
+}
+;
+
+
+ iso_level:
+ READ UNCOMMITTED
+ {
+ $$ = mm_strdup("read uncommitted");
+}
+| READ COMMITTED
+ {
+ $$ = mm_strdup("read committed");
+}
+| REPEATABLE READ
+ {
+ $$ = mm_strdup("repeatable read");
+}
+| SERIALIZABLE
+ {
+ $$ = mm_strdup("serializable");
+}
+;
+
+
+ opt_boolean_or_string:
+ TRUE_P
+ {
+ $$ = mm_strdup("true");
+}
+| FALSE_P
+ {
+ $$ = mm_strdup("false");
+}
+| ON
+ {
+ $$ = mm_strdup("on");
+}
+| NonReservedWord_or_Sconst
+ {
+ $$ = $1;
+}
+;
+
+
+ zone_value:
+ ecpg_sconst
+ {
+ $$ = $1;
+}
+| ecpg_ident
+ {
+ $$ = $1;
+}
+| ConstInterval ecpg_sconst opt_interval
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| ConstInterval '(' Iconst ')' ecpg_sconst
+ {
+ $$ = cat_str(5,$1,mm_strdup("("),$3,mm_strdup(")"),$5);
+}
+| NumericOnly
+ {
+ $$ = $1;
+}
+| DEFAULT
+ {
+ $$ = mm_strdup("default");
+}
+| LOCAL
+ {
+ $$ = mm_strdup("local");
+}
+;
+
+
+ opt_encoding:
+ ecpg_sconst
+ {
+ $$ = $1;
+}
+| DEFAULT
+ {
+ $$ = mm_strdup("default");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ NonReservedWord_or_Sconst:
+ NonReservedWord
+ {
+ $$ = $1;
+}
+| ecpg_sconst
+ {
+ $$ = $1;
+}
+;
+
+
+ VariableResetStmt:
+ RESET reset_rest
+ {
+ $$ = cat_str(2,mm_strdup("reset"),$2);
+}
+;
+
+
+ reset_rest:
+ generic_reset
+ {
+ $$ = $1;
+}
+| TIME ZONE
+ {
+ $$ = mm_strdup("time zone");
+}
+| TRANSACTION ISOLATION LEVEL
+ {
+ $$ = mm_strdup("transaction isolation level");
+}
+| SESSION AUTHORIZATION
+ {
+ $$ = mm_strdup("session authorization");
+}
+;
+
+
+ generic_reset:
+ var_name
+ {
+ $$ = $1;
+}
+| ALL
+ {
+ $$ = mm_strdup("all");
+}
+;
+
+
+ SetResetClause:
+ SET set_rest
+ {
+ $$ = cat_str(2,mm_strdup("set"),$2);
+}
+| VariableResetStmt
+ {
+ $$ = $1;
+}
+;
+
+
+ FunctionSetResetClause:
+ SET set_rest_more
+ {
+ $$ = cat_str(2,mm_strdup("set"),$2);
+}
+| VariableResetStmt
+ {
+ $$ = $1;
+}
+;
+
+
+ VariableShowStmt:
+SHOW var_name ecpg_into
+ {
+ $$ = cat_str(2,mm_strdup("show"),$2);
+}
+| SHOW TIME ZONE ecpg_into
+ {
+ $$ = mm_strdup("show time zone");
+}
+| SHOW TRANSACTION ISOLATION LEVEL ecpg_into
+ {
+ $$ = mm_strdup("show transaction isolation level");
+}
+| SHOW SESSION AUTHORIZATION ecpg_into
+ {
+ $$ = mm_strdup("show session authorization");
+}
+| SHOW ALL
+ {
+ mmerror(PARSE_ERROR, ET_ERROR, "SHOW ALL is not implemented");
+ $$ = EMPTY;
+ }
+;
+
+
+ ConstraintsSetStmt:
+ SET CONSTRAINTS constraints_set_list constraints_set_mode
+ {
+ $$ = cat_str(3,mm_strdup("set constraints"),$3,$4);
+}
+;
+
+
+ constraints_set_list:
+ ALL
+ {
+ $$ = mm_strdup("all");
+}
+| qualified_name_list
+ {
+ $$ = $1;
+}
+;
+
+
+ constraints_set_mode:
+ DEFERRED
+ {
+ $$ = mm_strdup("deferred");
+}
+| IMMEDIATE
+ {
+ $$ = mm_strdup("immediate");
+}
+;
+
+
+ CheckPointStmt:
+ CHECKPOINT
+ {
+ $$ = mm_strdup("checkpoint");
+}
+;
+
+
+ DiscardStmt:
+ DISCARD ALL
+ {
+ $$ = mm_strdup("discard all");
+}
+| DISCARD TEMP
+ {
+ $$ = mm_strdup("discard temp");
+}
+| DISCARD TEMPORARY
+ {
+ $$ = mm_strdup("discard temporary");
+}
+| DISCARD PLANS
+ {
+ $$ = mm_strdup("discard plans");
+}
+| DISCARD SEQUENCES
+ {
+ $$ = mm_strdup("discard sequences");
+}
+;
+
+
+ AlterTableStmt:
+ ALTER TABLE relation_expr alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter table"),$3,$4);
+}
+| ALTER TABLE IF_P EXISTS relation_expr alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter table if exists"),$5,$6);
+}
+| ALTER TABLE relation_expr partition_cmd
+ {
+ $$ = cat_str(3,mm_strdup("alter table"),$3,$4);
+}
+| ALTER TABLE IF_P EXISTS relation_expr partition_cmd
+ {
+ $$ = cat_str(3,mm_strdup("alter table if exists"),$5,$6);
+}
+| ALTER TABLE ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
+ {
+ $$ = cat_str(5,mm_strdup("alter table all in tablespace"),$6,mm_strdup("set tablespace"),$9,$10);
+}
+| ALTER TABLE ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
+ {
+ $$ = cat_str(7,mm_strdup("alter table all in tablespace"),$6,mm_strdup("owned by"),$9,mm_strdup("set tablespace"),$12,$13);
+}
+| ALTER INDEX qualified_name alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter index"),$3,$4);
+}
+| ALTER INDEX IF_P EXISTS qualified_name alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter index if exists"),$5,$6);
+}
+| ALTER INDEX qualified_name index_partition_cmd
+ {
+ $$ = cat_str(3,mm_strdup("alter index"),$3,$4);
+}
+| ALTER INDEX ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
+ {
+ $$ = cat_str(5,mm_strdup("alter index all in tablespace"),$6,mm_strdup("set tablespace"),$9,$10);
+}
+| ALTER INDEX ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
+ {
+ $$ = cat_str(7,mm_strdup("alter index all in tablespace"),$6,mm_strdup("owned by"),$9,mm_strdup("set tablespace"),$12,$13);
+}
+| ALTER SEQUENCE qualified_name alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter sequence"),$3,$4);
+}
+| ALTER SEQUENCE IF_P EXISTS qualified_name alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter sequence if exists"),$5,$6);
+}
+| ALTER VIEW qualified_name alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter view"),$3,$4);
+}
+| ALTER VIEW IF_P EXISTS qualified_name alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter view if exists"),$5,$6);
+}
+| ALTER MATERIALIZED VIEW qualified_name alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter materialized view"),$4,$5);
+}
+| ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter materialized view if exists"),$6,$7);
+}
+| ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
+ {
+ $$ = cat_str(5,mm_strdup("alter materialized view all in tablespace"),$7,mm_strdup("set tablespace"),$10,$11);
+}
+| ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
+ {
+ $$ = cat_str(7,mm_strdup("alter materialized view all in tablespace"),$7,mm_strdup("owned by"),$10,mm_strdup("set tablespace"),$13,$14);
+}
+| ALTER FOREIGN TABLE relation_expr alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter foreign table"),$4,$5);
+}
+| ALTER FOREIGN TABLE IF_P EXISTS relation_expr alter_table_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter foreign table if exists"),$6,$7);
+}
+;
+
+
+ alter_table_cmds:
+ alter_table_cmd
+ {
+ $$ = $1;
+}
+| alter_table_cmds ',' alter_table_cmd
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ partition_cmd:
+ ATTACH PARTITION qualified_name PartitionBoundSpec
+ {
+ $$ = cat_str(3,mm_strdup("attach partition"),$3,$4);
+}
+| DETACH PARTITION qualified_name opt_concurrently
+ {
+ $$ = cat_str(3,mm_strdup("detach partition"),$3,$4);
+}
+| DETACH PARTITION qualified_name FINALIZE
+ {
+ $$ = cat_str(3,mm_strdup("detach partition"),$3,mm_strdup("finalize"));
+}
+;
+
+
+ index_partition_cmd:
+ ATTACH PARTITION qualified_name
+ {
+ $$ = cat_str(2,mm_strdup("attach partition"),$3);
+}
+;
+
+
+ alter_table_cmd:
+ ADD_P columnDef
+ {
+ $$ = cat_str(2,mm_strdup("add"),$2);
+}
+| ADD_P IF_P NOT EXISTS columnDef
+ {
+ $$ = cat_str(2,mm_strdup("add if not exists"),$5);
+}
+| ADD_P COLUMN columnDef
+ {
+ $$ = cat_str(2,mm_strdup("add column"),$3);
+}
+| ADD_P COLUMN IF_P NOT EXISTS columnDef
+ {
+ $$ = cat_str(2,mm_strdup("add column if not exists"),$6);
+}
+| ALTER opt_column ColId alter_column_default
+ {
+ $$ = cat_str(4,mm_strdup("alter"),$2,$3,$4);
+}
+| ALTER opt_column ColId DROP NOT NULL_P
+ {
+ $$ = cat_str(4,mm_strdup("alter"),$2,$3,mm_strdup("drop not null"));
+}
+| ALTER opt_column ColId SET NOT NULL_P
+ {
+ $$ = cat_str(4,mm_strdup("alter"),$2,$3,mm_strdup("set not null"));
+}
+| ALTER opt_column ColId DROP EXPRESSION
+ {
+ $$ = cat_str(4,mm_strdup("alter"),$2,$3,mm_strdup("drop expression"));
+}
+| ALTER opt_column ColId DROP EXPRESSION IF_P EXISTS
+ {
+ $$ = cat_str(4,mm_strdup("alter"),$2,$3,mm_strdup("drop expression if exists"));
+}
+| ALTER opt_column ColId SET STATISTICS SignedIconst
+ {
+ $$ = cat_str(5,mm_strdup("alter"),$2,$3,mm_strdup("set statistics"),$6);
+}
+| ALTER opt_column Iconst SET STATISTICS SignedIconst
+ {
+ $$ = cat_str(5,mm_strdup("alter"),$2,$3,mm_strdup("set statistics"),$6);
+}
+| ALTER opt_column ColId SET reloptions
+ {
+ $$ = cat_str(5,mm_strdup("alter"),$2,$3,mm_strdup("set"),$5);
+}
+| ALTER opt_column ColId RESET reloptions
+ {
+ $$ = cat_str(5,mm_strdup("alter"),$2,$3,mm_strdup("reset"),$5);
+}
+| ALTER opt_column ColId SET STORAGE ColId
+ {
+ $$ = cat_str(5,mm_strdup("alter"),$2,$3,mm_strdup("set storage"),$6);
+}
+| ALTER opt_column ColId SET column_compression
+ {
+ $$ = cat_str(5,mm_strdup("alter"),$2,$3,mm_strdup("set"),$5);
+}
+| ALTER opt_column ColId ADD_P GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList
+ {
+ $$ = cat_str(7,mm_strdup("alter"),$2,$3,mm_strdup("add generated"),$6,mm_strdup("as identity"),$9);
+}
+| ALTER opt_column ColId alter_identity_column_option_list
+ {
+ $$ = cat_str(4,mm_strdup("alter"),$2,$3,$4);
+}
+| ALTER opt_column ColId DROP IDENTITY_P
+ {
+ $$ = cat_str(4,mm_strdup("alter"),$2,$3,mm_strdup("drop identity"));
+}
+| ALTER opt_column ColId DROP IDENTITY_P IF_P EXISTS
+ {
+ $$ = cat_str(4,mm_strdup("alter"),$2,$3,mm_strdup("drop identity if exists"));
+}
+| DROP opt_column IF_P EXISTS ColId opt_drop_behavior
+ {
+ $$ = cat_str(5,mm_strdup("drop"),$2,mm_strdup("if exists"),$5,$6);
+}
+| DROP opt_column ColId opt_drop_behavior
+ {
+ $$ = cat_str(4,mm_strdup("drop"),$2,$3,$4);
+}
+| ALTER opt_column ColId opt_set_data TYPE_P Typename opt_collate_clause alter_using
+ {
+ $$ = cat_str(8,mm_strdup("alter"),$2,$3,$4,mm_strdup("type"),$6,$7,$8);
+}
+| ALTER opt_column ColId alter_generic_options
+ {
+ $$ = cat_str(4,mm_strdup("alter"),$2,$3,$4);
+}
+| ADD_P TableConstraint
+ {
+ $$ = cat_str(2,mm_strdup("add"),$2);
+}
+| ALTER CONSTRAINT name ConstraintAttributeSpec
+ {
+ $$ = cat_str(3,mm_strdup("alter constraint"),$3,$4);
+}
+| VALIDATE CONSTRAINT name
+ {
+ $$ = cat_str(2,mm_strdup("validate constraint"),$3);
+}
+| DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop constraint if exists"),$5,$6);
+}
+| DROP CONSTRAINT name opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop constraint"),$3,$4);
+}
+| SET WITHOUT OIDS
+ {
+ $$ = mm_strdup("set without oids");
+}
+| CLUSTER ON name
+ {
+ $$ = cat_str(2,mm_strdup("cluster on"),$3);
+}
+| SET WITHOUT CLUSTER
+ {
+ $$ = mm_strdup("set without cluster");
+}
+| SET LOGGED
+ {
+ $$ = mm_strdup("set logged");
+}
+| SET UNLOGGED
+ {
+ $$ = mm_strdup("set unlogged");
+}
+| ENABLE_P TRIGGER name
+ {
+ $$ = cat_str(2,mm_strdup("enable trigger"),$3);
+}
+| ENABLE_P ALWAYS TRIGGER name
+ {
+ $$ = cat_str(2,mm_strdup("enable always trigger"),$4);
+}
+| ENABLE_P REPLICA TRIGGER name
+ {
+ $$ = cat_str(2,mm_strdup("enable replica trigger"),$4);
+}
+| ENABLE_P TRIGGER ALL
+ {
+ $$ = mm_strdup("enable trigger all");
+}
+| ENABLE_P TRIGGER USER
+ {
+ $$ = mm_strdup("enable trigger user");
+}
+| DISABLE_P TRIGGER name
+ {
+ $$ = cat_str(2,mm_strdup("disable trigger"),$3);
+}
+| DISABLE_P TRIGGER ALL
+ {
+ $$ = mm_strdup("disable trigger all");
+}
+| DISABLE_P TRIGGER USER
+ {
+ $$ = mm_strdup("disable trigger user");
+}
+| ENABLE_P RULE name
+ {
+ $$ = cat_str(2,mm_strdup("enable rule"),$3);
+}
+| ENABLE_P ALWAYS RULE name
+ {
+ $$ = cat_str(2,mm_strdup("enable always rule"),$4);
+}
+| ENABLE_P REPLICA RULE name
+ {
+ $$ = cat_str(2,mm_strdup("enable replica rule"),$4);
+}
+| DISABLE_P RULE name
+ {
+ $$ = cat_str(2,mm_strdup("disable rule"),$3);
+}
+| INHERIT qualified_name
+ {
+ $$ = cat_str(2,mm_strdup("inherit"),$2);
+}
+| NO INHERIT qualified_name
+ {
+ $$ = cat_str(2,mm_strdup("no inherit"),$3);
+}
+| OF any_name
+ {
+ $$ = cat_str(2,mm_strdup("of"),$2);
+}
+| NOT OF
+ {
+ $$ = mm_strdup("not of");
+}
+| OWNER TO RoleSpec
+ {
+ $$ = cat_str(2,mm_strdup("owner to"),$3);
+}
+| SET TABLESPACE name
+ {
+ $$ = cat_str(2,mm_strdup("set tablespace"),$3);
+}
+| SET reloptions
+ {
+ $$ = cat_str(2,mm_strdup("set"),$2);
+}
+| RESET reloptions
+ {
+ $$ = cat_str(2,mm_strdup("reset"),$2);
+}
+| REPLICA IDENTITY_P replica_identity
+ {
+ $$ = cat_str(2,mm_strdup("replica identity"),$3);
+}
+| ENABLE_P ROW LEVEL SECURITY
+ {
+ $$ = mm_strdup("enable row level security");
+}
+| DISABLE_P ROW LEVEL SECURITY
+ {
+ $$ = mm_strdup("disable row level security");
+}
+| FORCE ROW LEVEL SECURITY
+ {
+ $$ = mm_strdup("force row level security");
+}
+| NO FORCE ROW LEVEL SECURITY
+ {
+ $$ = mm_strdup("no force row level security");
+}
+| alter_generic_options
+ {
+ $$ = $1;
+}
+;
+
+
+ alter_column_default:
+ SET DEFAULT a_expr
+ {
+ $$ = cat_str(2,mm_strdup("set default"),$3);
+}
+| DROP DEFAULT
+ {
+ $$ = mm_strdup("drop default");
+}
+;
+
+
+ opt_drop_behavior:
+ CASCADE
+ {
+ $$ = mm_strdup("cascade");
+}
+| RESTRICT
+ {
+ $$ = mm_strdup("restrict");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_collate_clause:
+ COLLATE any_name
+ {
+ $$ = cat_str(2,mm_strdup("collate"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ alter_using:
+ USING a_expr
+ {
+ $$ = cat_str(2,mm_strdup("using"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ replica_identity:
+ NOTHING
+ {
+ $$ = mm_strdup("nothing");
+}
+| FULL
+ {
+ $$ = mm_strdup("full");
+}
+| DEFAULT
+ {
+ $$ = mm_strdup("default");
+}
+| USING INDEX name
+ {
+ $$ = cat_str(2,mm_strdup("using index"),$3);
+}
+;
+
+
+ reloptions:
+ '(' reloption_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+;
+
+
+ opt_reloptions:
+ WITH reloptions
+ {
+ $$ = cat_str(2,mm_strdup("with"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ reloption_list:
+ reloption_elem
+ {
+ $$ = $1;
+}
+| reloption_list ',' reloption_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ reloption_elem:
+ ColLabel '=' def_arg
+ {
+ $$ = cat_str(3,$1,mm_strdup("="),$3);
+}
+| ColLabel
+ {
+ $$ = $1;
+}
+| ColLabel '.' ColLabel '=' def_arg
+ {
+ $$ = cat_str(5,$1,mm_strdup("."),$3,mm_strdup("="),$5);
+}
+| ColLabel '.' ColLabel
+ {
+ $$ = cat_str(3,$1,mm_strdup("."),$3);
+}
+;
+
+
+ alter_identity_column_option_list:
+ alter_identity_column_option
+ {
+ $$ = $1;
+}
+| alter_identity_column_option_list alter_identity_column_option
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ alter_identity_column_option:
+ RESTART
+ {
+ $$ = mm_strdup("restart");
+}
+| RESTART opt_with NumericOnly
+ {
+ $$ = cat_str(3,mm_strdup("restart"),$2,$3);
+}
+| SET SeqOptElem
+ {
+ $$ = cat_str(2,mm_strdup("set"),$2);
+}
+| SET GENERATED generated_when
+ {
+ $$ = cat_str(2,mm_strdup("set generated"),$3);
+}
+;
+
+
+ PartitionBoundSpec:
+ FOR VALUES WITH '(' hash_partbound ')'
+ {
+ $$ = cat_str(3,mm_strdup("for values with ("),$5,mm_strdup(")"));
+}
+| FOR VALUES IN_P '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("for values in ("),$5,mm_strdup(")"));
+}
+| FOR VALUES FROM '(' expr_list ')' TO '(' expr_list ')'
+ {
+ $$ = cat_str(5,mm_strdup("for values from ("),$5,mm_strdup(") to ("),$9,mm_strdup(")"));
+}
+| DEFAULT
+ {
+ $$ = mm_strdup("default");
+}
+;
+
+
+ hash_partbound_elem:
+ NonReservedWord Iconst
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ hash_partbound:
+ hash_partbound_elem
+ {
+ $$ = $1;
+}
+| hash_partbound ',' hash_partbound_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ AlterCompositeTypeStmt:
+ ALTER TYPE_P any_name alter_type_cmds
+ {
+ $$ = cat_str(3,mm_strdup("alter type"),$3,$4);
+}
+;
+
+
+ alter_type_cmds:
+ alter_type_cmd
+ {
+ $$ = $1;
+}
+| alter_type_cmds ',' alter_type_cmd
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ alter_type_cmd:
+ ADD_P ATTRIBUTE TableFuncElement opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("add attribute"),$3,$4);
+}
+| DROP ATTRIBUTE IF_P EXISTS ColId opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop attribute if exists"),$5,$6);
+}
+| DROP ATTRIBUTE ColId opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop attribute"),$3,$4);
+}
+| ALTER ATTRIBUTE ColId opt_set_data TYPE_P Typename opt_collate_clause opt_drop_behavior
+ {
+ $$ = cat_str(7,mm_strdup("alter attribute"),$3,$4,mm_strdup("type"),$6,$7,$8);
+}
+;
+
+
+ ClosePortalStmt:
+ CLOSE cursor_name
+ {
+ char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : $2;
+ struct cursor *ptr = NULL;
+ for (ptr = cur; ptr != NULL; ptr = ptr -> next)
+ {
+ if (strcmp($2, ptr -> name) == 0)
+ {
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ break;
+ }
+ }
+ $$ = cat2_str(mm_strdup("close"), cursor_marker);
+ }
+| CLOSE ALL
+ {
+ $$ = mm_strdup("close all");
+}
+;
+
+
+ CopyStmt:
+ COPY opt_binary qualified_name opt_column_list copy_from opt_program copy_file_name copy_delimiter opt_with copy_options where_clause
+ {
+ if (strcmp($6, "from") == 0 &&
+ (strcmp($7, "stdin") == 0 || strcmp($7, "stdout") == 0))
+ mmerror(PARSE_ERROR, ET_WARNING, "COPY FROM STDIN is not implemented");
+
+ $$ = cat_str(11,mm_strdup("copy"),$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);
+}
+| COPY '(' PreparableStmt ')' TO opt_program copy_file_name opt_with copy_options
+ {
+ $$ = cat_str(7,mm_strdup("copy ("),$3,mm_strdup(") to"),$6,$7,$8,$9);
+}
+;
+
+
+ copy_from:
+ FROM
+ {
+ $$ = mm_strdup("from");
+}
+| TO
+ {
+ $$ = mm_strdup("to");
+}
+;
+
+
+ opt_program:
+ PROGRAM
+ {
+ $$ = mm_strdup("program");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ copy_file_name:
+ ecpg_sconst
+ {
+ $$ = $1;
+}
+| STDIN
+ {
+ $$ = mm_strdup("stdin");
+}
+| STDOUT
+ {
+ $$ = mm_strdup("stdout");
+}
+;
+
+
+ copy_options:
+ copy_opt_list
+ {
+ $$ = $1;
+}
+| '(' copy_generic_opt_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+;
+
+
+ copy_opt_list:
+ copy_opt_list copy_opt_item
+ {
+ $$ = cat_str(2,$1,$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ copy_opt_item:
+ BINARY
+ {
+ $$ = mm_strdup("binary");
+}
+| FREEZE
+ {
+ $$ = mm_strdup("freeze");
+}
+| DELIMITER opt_as ecpg_sconst
+ {
+ $$ = cat_str(3,mm_strdup("delimiter"),$2,$3);
+}
+| NULL_P opt_as ecpg_sconst
+ {
+ $$ = cat_str(3,mm_strdup("null"),$2,$3);
+}
+| CSV
+ {
+ $$ = mm_strdup("csv");
+}
+| HEADER_P
+ {
+ $$ = mm_strdup("header");
+}
+| QUOTE opt_as ecpg_sconst
+ {
+ $$ = cat_str(3,mm_strdup("quote"),$2,$3);
+}
+| ESCAPE opt_as ecpg_sconst
+ {
+ $$ = cat_str(3,mm_strdup("escape"),$2,$3);
+}
+| FORCE QUOTE columnList
+ {
+ $$ = cat_str(2,mm_strdup("force quote"),$3);
+}
+| FORCE QUOTE '*'
+ {
+ $$ = mm_strdup("force quote *");
+}
+| FORCE NOT NULL_P columnList
+ {
+ $$ = cat_str(2,mm_strdup("force not null"),$4);
+}
+| FORCE NULL_P columnList
+ {
+ $$ = cat_str(2,mm_strdup("force null"),$3);
+}
+| ENCODING ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("encoding"),$2);
+}
+;
+
+
+ opt_binary:
+ BINARY
+ {
+ $$ = mm_strdup("binary");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ copy_delimiter:
+ opt_using DELIMITERS ecpg_sconst
+ {
+ $$ = cat_str(3,$1,mm_strdup("delimiters"),$3);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_using:
+ USING
+ {
+ $$ = mm_strdup("using");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ copy_generic_opt_list:
+ copy_generic_opt_elem
+ {
+ $$ = $1;
+}
+| copy_generic_opt_list ',' copy_generic_opt_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ copy_generic_opt_elem:
+ ColLabel copy_generic_opt_arg
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ copy_generic_opt_arg:
+ opt_boolean_or_string
+ {
+ $$ = $1;
+}
+| NumericOnly
+ {
+ $$ = $1;
+}
+| '*'
+ {
+ $$ = mm_strdup("*");
+}
+| '(' copy_generic_opt_arg_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ copy_generic_opt_arg_list:
+ copy_generic_opt_arg_list_item
+ {
+ $$ = $1;
+}
+| copy_generic_opt_arg_list ',' copy_generic_opt_arg_list_item
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ copy_generic_opt_arg_list_item:
+ opt_boolean_or_string
+ {
+ $$ = $1;
+}
+;
+
+
+ CreateStmt:
+ CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' OptInherit OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
+ {
+ $$ = cat_str(13,mm_strdup("create"),$2,mm_strdup("table"),$4,mm_strdup("("),$6,mm_strdup(")"),$8,$9,$10,$11,$12,$13);
+}
+| CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name '(' OptTableElementList ')' OptInherit OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
+ {
+ $$ = cat_str(13,mm_strdup("create"),$2,mm_strdup("table if not exists"),$7,mm_strdup("("),$9,mm_strdup(")"),$11,$12,$13,$14,$15,$16);
+}
+| CREATE OptTemp TABLE qualified_name OF any_name OptTypedTableElementList OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
+ {
+ $$ = cat_str(12,mm_strdup("create"),$2,mm_strdup("table"),$4,mm_strdup("of"),$6,$7,$8,$9,$10,$11,$12);
+}
+| CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name OF any_name OptTypedTableElementList OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
+ {
+ $$ = cat_str(12,mm_strdup("create"),$2,mm_strdup("table if not exists"),$7,mm_strdup("of"),$9,$10,$11,$12,$13,$14,$15);
+}
+| CREATE OptTemp TABLE qualified_name PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
+ {
+ $$ = cat_str(13,mm_strdup("create"),$2,mm_strdup("table"),$4,mm_strdup("partition of"),$7,$8,$9,$10,$11,$12,$13,$14);
+}
+| CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
+ {
+ $$ = cat_str(13,mm_strdup("create"),$2,mm_strdup("table if not exists"),$7,mm_strdup("partition of"),$10,$11,$12,$13,$14,$15,$16,$17);
+}
+;
+
+
+ OptTemp:
+ TEMPORARY
+ {
+ $$ = mm_strdup("temporary");
+}
+| TEMP
+ {
+ $$ = mm_strdup("temp");
+}
+| LOCAL TEMPORARY
+ {
+ $$ = mm_strdup("local temporary");
+}
+| LOCAL TEMP
+ {
+ $$ = mm_strdup("local temp");
+}
+| GLOBAL TEMPORARY
+ {
+ $$ = mm_strdup("global temporary");
+}
+| GLOBAL TEMP
+ {
+ $$ = mm_strdup("global temp");
+}
+| UNLOGGED
+ {
+ $$ = mm_strdup("unlogged");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptTableElementList:
+ TableElementList
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptTypedTableElementList:
+ '(' TypedTableElementList ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ TableElementList:
+ TableElement
+ {
+ $$ = $1;
+}
+| TableElementList ',' TableElement
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ TypedTableElementList:
+ TypedTableElement
+ {
+ $$ = $1;
+}
+| TypedTableElementList ',' TypedTableElement
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ TableElement:
+ columnDef
+ {
+ $$ = $1;
+}
+| TableLikeClause
+ {
+ $$ = $1;
+}
+| TableConstraint
+ {
+ $$ = $1;
+}
+;
+
+
+ TypedTableElement:
+ columnOptions
+ {
+ $$ = $1;
+}
+| TableConstraint
+ {
+ $$ = $1;
+}
+;
+
+
+ columnDef:
+ ColId Typename opt_column_compression create_generic_options ColQualList
+ {
+ $$ = cat_str(5,$1,$2,$3,$4,$5);
+}
+;
+
+
+ columnOptions:
+ ColId ColQualList
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| ColId WITH OPTIONS ColQualList
+ {
+ $$ = cat_str(3,$1,mm_strdup("with options"),$4);
+}
+;
+
+
+ column_compression:
+ COMPRESSION ColId
+ {
+ $$ = cat_str(2,mm_strdup("compression"),$2);
+}
+| COMPRESSION DEFAULT
+ {
+ $$ = mm_strdup("compression default");
+}
+;
+
+
+ opt_column_compression:
+ column_compression
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ ColQualList:
+ ColQualList ColConstraint
+ {
+ $$ = cat_str(2,$1,$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ ColConstraint:
+ CONSTRAINT name ColConstraintElem
+ {
+ $$ = cat_str(3,mm_strdup("constraint"),$2,$3);
+}
+| ColConstraintElem
+ {
+ $$ = $1;
+}
+| ConstraintAttr
+ {
+ $$ = $1;
+}
+| COLLATE any_name
+ {
+ $$ = cat_str(2,mm_strdup("collate"),$2);
+}
+;
+
+
+ ColConstraintElem:
+ NOT NULL_P
+ {
+ $$ = mm_strdup("not null");
+}
+| NULL_P
+ {
+ $$ = mm_strdup("null");
+}
+| UNIQUE opt_definition OptConsTableSpace
+ {
+ $$ = cat_str(3,mm_strdup("unique"),$2,$3);
+}
+| PRIMARY KEY opt_definition OptConsTableSpace
+ {
+ $$ = cat_str(3,mm_strdup("primary key"),$3,$4);
+}
+| CHECK '(' a_expr ')' opt_no_inherit
+ {
+ $$ = cat_str(4,mm_strdup("check ("),$3,mm_strdup(")"),$5);
+}
+| DEFAULT b_expr
+ {
+ $$ = cat_str(2,mm_strdup("default"),$2);
+}
+| GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList
+ {
+ $$ = cat_str(4,mm_strdup("generated"),$2,mm_strdup("as identity"),$5);
+}
+| GENERATED generated_when AS '(' a_expr ')' STORED
+ {
+ $$ = cat_str(5,mm_strdup("generated"),$2,mm_strdup("as ("),$5,mm_strdup(") stored"));
+}
+| REFERENCES qualified_name opt_column_list key_match key_actions
+ {
+ $$ = cat_str(5,mm_strdup("references"),$2,$3,$4,$5);
+}
+;
+
+
+ generated_when:
+ ALWAYS
+ {
+ $$ = mm_strdup("always");
+}
+| BY DEFAULT
+ {
+ $$ = mm_strdup("by default");
+}
+;
+
+
+ ConstraintAttr:
+ DEFERRABLE
+ {
+ $$ = mm_strdup("deferrable");
+}
+| NOT DEFERRABLE
+ {
+ $$ = mm_strdup("not deferrable");
+}
+| INITIALLY DEFERRED
+ {
+ $$ = mm_strdup("initially deferred");
+}
+| INITIALLY IMMEDIATE
+ {
+ $$ = mm_strdup("initially immediate");
+}
+;
+
+
+ TableLikeClause:
+ LIKE qualified_name TableLikeOptionList
+ {
+ $$ = cat_str(3,mm_strdup("like"),$2,$3);
+}
+;
+
+
+ TableLikeOptionList:
+ TableLikeOptionList INCLUDING TableLikeOption
+ {
+ $$ = cat_str(3,$1,mm_strdup("including"),$3);
+}
+| TableLikeOptionList EXCLUDING TableLikeOption
+ {
+ $$ = cat_str(3,$1,mm_strdup("excluding"),$3);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ TableLikeOption:
+ COMMENTS
+ {
+ $$ = mm_strdup("comments");
+}
+| COMPRESSION
+ {
+ $$ = mm_strdup("compression");
+}
+| CONSTRAINTS
+ {
+ $$ = mm_strdup("constraints");
+}
+| DEFAULTS
+ {
+ $$ = mm_strdup("defaults");
+}
+| IDENTITY_P
+ {
+ $$ = mm_strdup("identity");
+}
+| GENERATED
+ {
+ $$ = mm_strdup("generated");
+}
+| INDEXES
+ {
+ $$ = mm_strdup("indexes");
+}
+| STATISTICS
+ {
+ $$ = mm_strdup("statistics");
+}
+| STORAGE
+ {
+ $$ = mm_strdup("storage");
+}
+| ALL
+ {
+ $$ = mm_strdup("all");
+}
+;
+
+
+ TableConstraint:
+ CONSTRAINT name ConstraintElem
+ {
+ $$ = cat_str(3,mm_strdup("constraint"),$2,$3);
+}
+| ConstraintElem
+ {
+ $$ = $1;
+}
+;
+
+
+ ConstraintElem:
+ CHECK '(' a_expr ')' ConstraintAttributeSpec
+ {
+ $$ = cat_str(4,mm_strdup("check ("),$3,mm_strdup(")"),$5);
+}
+| UNIQUE '(' columnList ')' opt_c_include opt_definition OptConsTableSpace ConstraintAttributeSpec
+ {
+ $$ = cat_str(7,mm_strdup("unique ("),$3,mm_strdup(")"),$5,$6,$7,$8);
+}
+| UNIQUE ExistingIndex ConstraintAttributeSpec
+ {
+ $$ = cat_str(3,mm_strdup("unique"),$2,$3);
+}
+| PRIMARY KEY '(' columnList ')' opt_c_include opt_definition OptConsTableSpace ConstraintAttributeSpec
+ {
+ $$ = cat_str(7,mm_strdup("primary key ("),$4,mm_strdup(")"),$6,$7,$8,$9);
+}
+| PRIMARY KEY ExistingIndex ConstraintAttributeSpec
+ {
+ $$ = cat_str(3,mm_strdup("primary key"),$3,$4);
+}
+| EXCLUDE access_method_clause '(' ExclusionConstraintList ')' opt_c_include opt_definition OptConsTableSpace OptWhereClause ConstraintAttributeSpec
+ {
+ $$ = cat_str(10,mm_strdup("exclude"),$2,mm_strdup("("),$4,mm_strdup(")"),$6,$7,$8,$9,$10);
+}
+| FOREIGN KEY '(' columnList ')' REFERENCES qualified_name opt_column_list key_match key_actions ConstraintAttributeSpec
+ {
+ $$ = cat_str(8,mm_strdup("foreign key ("),$4,mm_strdup(") references"),$7,$8,$9,$10,$11);
+}
+;
+
+
+ opt_no_inherit:
+ NO INHERIT
+ {
+ $$ = mm_strdup("no inherit");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_column_list:
+ '(' columnList ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ columnList:
+ columnElem
+ {
+ $$ = $1;
+}
+| columnList ',' columnElem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ columnElem:
+ ColId
+ {
+ $$ = $1;
+}
+;
+
+
+ opt_c_include:
+ INCLUDE '(' columnList ')'
+ {
+ $$ = cat_str(3,mm_strdup("include ("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ key_match:
+ MATCH FULL
+ {
+ $$ = mm_strdup("match full");
+}
+| MATCH PARTIAL
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = mm_strdup("match partial");
+}
+| MATCH SIMPLE
+ {
+ $$ = mm_strdup("match simple");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ ExclusionConstraintList:
+ ExclusionConstraintElem
+ {
+ $$ = $1;
+}
+| ExclusionConstraintList ',' ExclusionConstraintElem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ ExclusionConstraintElem:
+ index_elem WITH any_operator
+ {
+ $$ = cat_str(3,$1,mm_strdup("with"),$3);
+}
+| index_elem WITH OPERATOR '(' any_operator ')'
+ {
+ $$ = cat_str(4,$1,mm_strdup("with operator ("),$5,mm_strdup(")"));
+}
+;
+
+
+ OptWhereClause:
+ WHERE '(' a_expr ')'
+ {
+ $$ = cat_str(3,mm_strdup("where ("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ key_actions:
+ key_update
+ {
+ $$ = $1;
+}
+| key_delete
+ {
+ $$ = $1;
+}
+| key_update key_delete
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| key_delete key_update
+ {
+ $$ = cat_str(2,$1,$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ key_update:
+ ON UPDATE key_action
+ {
+ $$ = cat_str(2,mm_strdup("on update"),$3);
+}
+;
+
+
+ key_delete:
+ ON DELETE_P key_action
+ {
+ $$ = cat_str(2,mm_strdup("on delete"),$3);
+}
+;
+
+
+ key_action:
+ NO ACTION
+ {
+ $$ = mm_strdup("no action");
+}
+| RESTRICT
+ {
+ $$ = mm_strdup("restrict");
+}
+| CASCADE
+ {
+ $$ = mm_strdup("cascade");
+}
+| SET NULL_P
+ {
+ $$ = mm_strdup("set null");
+}
+| SET DEFAULT
+ {
+ $$ = mm_strdup("set default");
+}
+;
+
+
+ OptInherit:
+ INHERITS '(' qualified_name_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("inherits ("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptPartitionSpec:
+ PartitionSpec
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ PartitionSpec:
+ PARTITION BY ColId '(' part_params ')'
+ {
+ $$ = cat_str(5,mm_strdup("partition by"),$3,mm_strdup("("),$5,mm_strdup(")"));
+}
+;
+
+
+ part_params:
+ part_elem
+ {
+ $$ = $1;
+}
+| part_params ',' part_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ part_elem:
+ ColId opt_collate opt_class
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| func_expr_windowless opt_collate opt_class
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| '(' a_expr ')' opt_collate opt_class
+ {
+ $$ = cat_str(5,mm_strdup("("),$2,mm_strdup(")"),$4,$5);
+}
+;
+
+
+ table_access_method_clause:
+ USING name
+ {
+ $$ = cat_str(2,mm_strdup("using"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptWith:
+ WITH reloptions
+ {
+ $$ = cat_str(2,mm_strdup("with"),$2);
+}
+| WITHOUT OIDS
+ {
+ $$ = mm_strdup("without oids");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OnCommitOption:
+ ON COMMIT DROP
+ {
+ $$ = mm_strdup("on commit drop");
+}
+| ON COMMIT DELETE_P ROWS
+ {
+ $$ = mm_strdup("on commit delete rows");
+}
+| ON COMMIT PRESERVE ROWS
+ {
+ $$ = mm_strdup("on commit preserve rows");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptTableSpace:
+ TABLESPACE name
+ {
+ $$ = cat_str(2,mm_strdup("tablespace"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptConsTableSpace:
+ USING INDEX TABLESPACE name
+ {
+ $$ = cat_str(2,mm_strdup("using index tablespace"),$4);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ ExistingIndex:
+ USING INDEX name
+ {
+ $$ = cat_str(2,mm_strdup("using index"),$3);
+}
+;
+
+
+ CreateStatsStmt:
+ CREATE STATISTICS any_name opt_name_list ON stats_params FROM from_list
+ {
+ $$ = cat_str(7,mm_strdup("create statistics"),$3,$4,mm_strdup("on"),$6,mm_strdup("from"),$8);
+}
+| CREATE STATISTICS IF_P NOT EXISTS any_name opt_name_list ON stats_params FROM from_list
+ {
+ $$ = cat_str(7,mm_strdup("create statistics if not exists"),$6,$7,mm_strdup("on"),$9,mm_strdup("from"),$11);
+}
+;
+
+
+ stats_params:
+ stats_param
+ {
+ $$ = $1;
+}
+| stats_params ',' stats_param
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ stats_param:
+ ColId
+ {
+ $$ = $1;
+}
+| func_expr_windowless
+ {
+ $$ = $1;
+}
+| '(' a_expr ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+;
+
+
+ AlterStatsStmt:
+ ALTER STATISTICS any_name SET STATISTICS SignedIconst
+ {
+ $$ = cat_str(4,mm_strdup("alter statistics"),$3,mm_strdup("set statistics"),$6);
+}
+| ALTER STATISTICS IF_P EXISTS any_name SET STATISTICS SignedIconst
+ {
+ $$ = cat_str(4,mm_strdup("alter statistics if exists"),$5,mm_strdup("set statistics"),$8);
+}
+;
+
+
+ create_as_target:
+ qualified_name opt_column_list table_access_method_clause OptWith OnCommitOption OptTableSpace
+ {
+ $$ = cat_str(6,$1,$2,$3,$4,$5,$6);
+}
+;
+
+
+ opt_with_data:
+ WITH DATA_P
+ {
+ $$ = mm_strdup("with data");
+}
+| WITH NO DATA_P
+ {
+ $$ = mm_strdup("with no data");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ CreateMatViewStmt:
+ CREATE OptNoLog MATERIALIZED VIEW create_mv_target AS SelectStmt opt_with_data
+ {
+ $$ = cat_str(7,mm_strdup("create"),$2,mm_strdup("materialized view"),$5,mm_strdup("as"),$7,$8);
+}
+| CREATE OptNoLog MATERIALIZED VIEW IF_P NOT EXISTS create_mv_target AS SelectStmt opt_with_data
+ {
+ $$ = cat_str(7,mm_strdup("create"),$2,mm_strdup("materialized view if not exists"),$8,mm_strdup("as"),$10,$11);
+}
+;
+
+
+ create_mv_target:
+ qualified_name opt_column_list table_access_method_clause opt_reloptions OptTableSpace
+ {
+ $$ = cat_str(5,$1,$2,$3,$4,$5);
+}
+;
+
+
+ OptNoLog:
+ UNLOGGED
+ {
+ $$ = mm_strdup("unlogged");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ RefreshMatViewStmt:
+ REFRESH MATERIALIZED VIEW opt_concurrently qualified_name opt_with_data
+ {
+ $$ = cat_str(4,mm_strdup("refresh materialized view"),$4,$5,$6);
+}
+;
+
+
+ CreateSeqStmt:
+ CREATE OptTemp SEQUENCE qualified_name OptSeqOptList
+ {
+ $$ = cat_str(5,mm_strdup("create"),$2,mm_strdup("sequence"),$4,$5);
+}
+| CREATE OptTemp SEQUENCE IF_P NOT EXISTS qualified_name OptSeqOptList
+ {
+ $$ = cat_str(5,mm_strdup("create"),$2,mm_strdup("sequence if not exists"),$7,$8);
+}
+;
+
+
+ AlterSeqStmt:
+ ALTER SEQUENCE qualified_name SeqOptList
+ {
+ $$ = cat_str(3,mm_strdup("alter sequence"),$3,$4);
+}
+| ALTER SEQUENCE IF_P EXISTS qualified_name SeqOptList
+ {
+ $$ = cat_str(3,mm_strdup("alter sequence if exists"),$5,$6);
+}
+;
+
+
+ OptSeqOptList:
+ SeqOptList
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptParenthesizedSeqOptList:
+ '(' SeqOptList ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ SeqOptList:
+ SeqOptElem
+ {
+ $$ = $1;
+}
+| SeqOptList SeqOptElem
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ SeqOptElem:
+ AS SimpleTypename
+ {
+ $$ = cat_str(2,mm_strdup("as"),$2);
+}
+| CACHE NumericOnly
+ {
+ $$ = cat_str(2,mm_strdup("cache"),$2);
+}
+| CYCLE
+ {
+ $$ = mm_strdup("cycle");
+}
+| NO CYCLE
+ {
+ $$ = mm_strdup("no cycle");
+}
+| INCREMENT opt_by NumericOnly
+ {
+ $$ = cat_str(3,mm_strdup("increment"),$2,$3);
+}
+| MAXVALUE NumericOnly
+ {
+ $$ = cat_str(2,mm_strdup("maxvalue"),$2);
+}
+| MINVALUE NumericOnly
+ {
+ $$ = cat_str(2,mm_strdup("minvalue"),$2);
+}
+| NO MAXVALUE
+ {
+ $$ = mm_strdup("no maxvalue");
+}
+| NO MINVALUE
+ {
+ $$ = mm_strdup("no minvalue");
+}
+| OWNED BY any_name
+ {
+ $$ = cat_str(2,mm_strdup("owned by"),$3);
+}
+| SEQUENCE NAME_P any_name
+ {
+ $$ = cat_str(2,mm_strdup("sequence name"),$3);
+}
+| START opt_with NumericOnly
+ {
+ $$ = cat_str(3,mm_strdup("start"),$2,$3);
+}
+| RESTART
+ {
+ $$ = mm_strdup("restart");
+}
+| RESTART opt_with NumericOnly
+ {
+ $$ = cat_str(3,mm_strdup("restart"),$2,$3);
+}
+;
+
+
+ opt_by:
+ BY
+ {
+ $$ = mm_strdup("by");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ NumericOnly:
+ ecpg_fconst
+ {
+ $$ = $1;
+}
+| '+' ecpg_fconst
+ {
+ $$ = cat_str(2,mm_strdup("+"),$2);
+}
+| '-' ecpg_fconst
+ {
+ $$ = cat_str(2,mm_strdup("-"),$2);
+}
+| SignedIconst
+ {
+ $$ = $1;
+}
+;
+
+
+ NumericOnly_list:
+ NumericOnly
+ {
+ $$ = $1;
+}
+| NumericOnly_list ',' NumericOnly
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ CreatePLangStmt:
+ CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name
+ {
+ $$ = cat_str(6,mm_strdup("create"),$2,$3,$4,mm_strdup("language"),$6);
+}
+| CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name HANDLER handler_name opt_inline_handler opt_validator
+ {
+ $$ = cat_str(10,mm_strdup("create"),$2,$3,$4,mm_strdup("language"),$6,mm_strdup("handler"),$8,$9,$10);
+}
+;
+
+
+ opt_trusted:
+ TRUSTED
+ {
+ $$ = mm_strdup("trusted");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ handler_name:
+ name
+ {
+ $$ = $1;
+}
+| name attrs
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ opt_inline_handler:
+ INLINE_P handler_name
+ {
+ $$ = cat_str(2,mm_strdup("inline"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ validator_clause:
+ VALIDATOR handler_name
+ {
+ $$ = cat_str(2,mm_strdup("validator"),$2);
+}
+| NO VALIDATOR
+ {
+ $$ = mm_strdup("no validator");
+}
+;
+
+
+ opt_validator:
+ validator_clause
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_procedural:
+ PROCEDURAL
+ {
+ $$ = mm_strdup("procedural");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ CreateTableSpaceStmt:
+ CREATE TABLESPACE name OptTableSpaceOwner LOCATION ecpg_sconst opt_reloptions
+ {
+ $$ = cat_str(6,mm_strdup("create tablespace"),$3,$4,mm_strdup("location"),$6,$7);
+}
+;
+
+
+ OptTableSpaceOwner:
+ OWNER RoleSpec
+ {
+ $$ = cat_str(2,mm_strdup("owner"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ DropTableSpaceStmt:
+ DROP TABLESPACE name
+ {
+ $$ = cat_str(2,mm_strdup("drop tablespace"),$3);
+}
+| DROP TABLESPACE IF_P EXISTS name
+ {
+ $$ = cat_str(2,mm_strdup("drop tablespace if exists"),$5);
+}
+;
+
+
+ CreateExtensionStmt:
+ CREATE EXTENSION name opt_with create_extension_opt_list
+ {
+ $$ = cat_str(4,mm_strdup("create extension"),$3,$4,$5);
+}
+| CREATE EXTENSION IF_P NOT EXISTS name opt_with create_extension_opt_list
+ {
+ $$ = cat_str(4,mm_strdup("create extension if not exists"),$6,$7,$8);
+}
+;
+
+
+ create_extension_opt_list:
+ create_extension_opt_list create_extension_opt_item
+ {
+ $$ = cat_str(2,$1,$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ create_extension_opt_item:
+ SCHEMA name
+ {
+ $$ = cat_str(2,mm_strdup("schema"),$2);
+}
+| VERSION_P NonReservedWord_or_Sconst
+ {
+ $$ = cat_str(2,mm_strdup("version"),$2);
+}
+| FROM NonReservedWord_or_Sconst
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = cat_str(2,mm_strdup("from"),$2);
+}
+| CASCADE
+ {
+ $$ = mm_strdup("cascade");
+}
+;
+
+
+ AlterExtensionStmt:
+ ALTER EXTENSION name UPDATE alter_extension_opt_list
+ {
+ $$ = cat_str(4,mm_strdup("alter extension"),$3,mm_strdup("update"),$5);
+}
+;
+
+
+ alter_extension_opt_list:
+ alter_extension_opt_list alter_extension_opt_item
+ {
+ $$ = cat_str(2,$1,$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ alter_extension_opt_item:
+ TO NonReservedWord_or_Sconst
+ {
+ $$ = cat_str(2,mm_strdup("to"),$2);
+}
+;
+
+
+ AlterExtensionContentsStmt:
+ ALTER EXTENSION name add_drop object_type_name name
+ {
+ $$ = cat_str(5,mm_strdup("alter extension"),$3,$4,$5,$6);
+}
+| ALTER EXTENSION name add_drop object_type_any_name any_name
+ {
+ $$ = cat_str(5,mm_strdup("alter extension"),$3,$4,$5,$6);
+}
+| ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes
+ {
+ $$ = cat_str(5,mm_strdup("alter extension"),$3,$4,mm_strdup("aggregate"),$6);
+}
+| ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')'
+ {
+ $$ = cat_str(8,mm_strdup("alter extension"),$3,$4,mm_strdup("cast ("),$7,mm_strdup("as"),$9,mm_strdup(")"));
+}
+| ALTER EXTENSION name add_drop DOMAIN_P Typename
+ {
+ $$ = cat_str(5,mm_strdup("alter extension"),$3,$4,mm_strdup("domain"),$6);
+}
+| ALTER EXTENSION name add_drop FUNCTION function_with_argtypes
+ {
+ $$ = cat_str(5,mm_strdup("alter extension"),$3,$4,mm_strdup("function"),$6);
+}
+| ALTER EXTENSION name add_drop OPERATOR operator_with_argtypes
+ {
+ $$ = cat_str(5,mm_strdup("alter extension"),$3,$4,mm_strdup("operator"),$6);
+}
+| ALTER EXTENSION name add_drop OPERATOR CLASS any_name USING name
+ {
+ $$ = cat_str(7,mm_strdup("alter extension"),$3,$4,mm_strdup("operator class"),$7,mm_strdup("using"),$9);
+}
+| ALTER EXTENSION name add_drop OPERATOR FAMILY any_name USING name
+ {
+ $$ = cat_str(7,mm_strdup("alter extension"),$3,$4,mm_strdup("operator family"),$7,mm_strdup("using"),$9);
+}
+| ALTER EXTENSION name add_drop PROCEDURE function_with_argtypes
+ {
+ $$ = cat_str(5,mm_strdup("alter extension"),$3,$4,mm_strdup("procedure"),$6);
+}
+| ALTER EXTENSION name add_drop ROUTINE function_with_argtypes
+ {
+ $$ = cat_str(5,mm_strdup("alter extension"),$3,$4,mm_strdup("routine"),$6);
+}
+| ALTER EXTENSION name add_drop TRANSFORM FOR Typename LANGUAGE name
+ {
+ $$ = cat_str(7,mm_strdup("alter extension"),$3,$4,mm_strdup("transform for"),$7,mm_strdup("language"),$9);
+}
+| ALTER EXTENSION name add_drop TYPE_P Typename
+ {
+ $$ = cat_str(5,mm_strdup("alter extension"),$3,$4,mm_strdup("type"),$6);
+}
+;
+
+
+ CreateFdwStmt:
+ CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic_options
+ {
+ $$ = cat_str(4,mm_strdup("create foreign data wrapper"),$5,$6,$7);
+}
+;
+
+
+ fdw_option:
+ HANDLER handler_name
+ {
+ $$ = cat_str(2,mm_strdup("handler"),$2);
+}
+| NO HANDLER
+ {
+ $$ = mm_strdup("no handler");
+}
+| VALIDATOR handler_name
+ {
+ $$ = cat_str(2,mm_strdup("validator"),$2);
+}
+| NO VALIDATOR
+ {
+ $$ = mm_strdup("no validator");
+}
+;
+
+
+ fdw_options:
+ fdw_option
+ {
+ $$ = $1;
+}
+| fdw_options fdw_option
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ opt_fdw_options:
+ fdw_options
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ AlterFdwStmt:
+ ALTER FOREIGN DATA_P WRAPPER name opt_fdw_options alter_generic_options
+ {
+ $$ = cat_str(4,mm_strdup("alter foreign data wrapper"),$5,$6,$7);
+}
+| ALTER FOREIGN DATA_P WRAPPER name fdw_options
+ {
+ $$ = cat_str(3,mm_strdup("alter foreign data wrapper"),$5,$6);
+}
+;
+
+
+ create_generic_options:
+ OPTIONS '(' generic_option_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("options ("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ generic_option_list:
+ generic_option_elem
+ {
+ $$ = $1;
+}
+| generic_option_list ',' generic_option_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ alter_generic_options:
+ OPTIONS '(' alter_generic_option_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("options ("),$3,mm_strdup(")"));
+}
+;
+
+
+ alter_generic_option_list:
+ alter_generic_option_elem
+ {
+ $$ = $1;
+}
+| alter_generic_option_list ',' alter_generic_option_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ alter_generic_option_elem:
+ generic_option_elem
+ {
+ $$ = $1;
+}
+| SET generic_option_elem
+ {
+ $$ = cat_str(2,mm_strdup("set"),$2);
+}
+| ADD_P generic_option_elem
+ {
+ $$ = cat_str(2,mm_strdup("add"),$2);
+}
+| DROP generic_option_name
+ {
+ $$ = cat_str(2,mm_strdup("drop"),$2);
+}
+;
+
+
+ generic_option_elem:
+ generic_option_name generic_option_arg
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ generic_option_name:
+ ColLabel
+ {
+ $$ = $1;
+}
+;
+
+
+ generic_option_arg:
+ ecpg_sconst
+ {
+ $$ = $1;
+}
+;
+
+
+ CreateForeignServerStmt:
+ CREATE SERVER name opt_type opt_foreign_server_version FOREIGN DATA_P WRAPPER name create_generic_options
+ {
+ $$ = cat_str(7,mm_strdup("create server"),$3,$4,$5,mm_strdup("foreign data wrapper"),$9,$10);
+}
+| CREATE SERVER IF_P NOT EXISTS name opt_type opt_foreign_server_version FOREIGN DATA_P WRAPPER name create_generic_options
+ {
+ $$ = cat_str(7,mm_strdup("create server if not exists"),$6,$7,$8,mm_strdup("foreign data wrapper"),$12,$13);
+}
+;
+
+
+ opt_type:
+ TYPE_P ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("type"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ foreign_server_version:
+ VERSION_P ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("version"),$2);
+}
+| VERSION_P NULL_P
+ {
+ $$ = mm_strdup("version null");
+}
+;
+
+
+ opt_foreign_server_version:
+ foreign_server_version
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ AlterForeignServerStmt:
+ ALTER SERVER name foreign_server_version alter_generic_options
+ {
+ $$ = cat_str(4,mm_strdup("alter server"),$3,$4,$5);
+}
+| ALTER SERVER name foreign_server_version
+ {
+ $$ = cat_str(3,mm_strdup("alter server"),$3,$4);
+}
+| ALTER SERVER name alter_generic_options
+ {
+ $$ = cat_str(3,mm_strdup("alter server"),$3,$4);
+}
+;
+
+
+ CreateForeignTableStmt:
+ CREATE FOREIGN TABLE qualified_name '(' OptTableElementList ')' OptInherit SERVER name create_generic_options
+ {
+ $$ = cat_str(9,mm_strdup("create foreign table"),$4,mm_strdup("("),$6,mm_strdup(")"),$8,mm_strdup("server"),$10,$11);
+}
+| CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name '(' OptTableElementList ')' OptInherit SERVER name create_generic_options
+ {
+ $$ = cat_str(9,mm_strdup("create foreign table if not exists"),$7,mm_strdup("("),$9,mm_strdup(")"),$11,mm_strdup("server"),$13,$14);
+}
+| CREATE FOREIGN TABLE qualified_name PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec SERVER name create_generic_options
+ {
+ $$ = cat_str(9,mm_strdup("create foreign table"),$4,mm_strdup("partition of"),$7,$8,$9,mm_strdup("server"),$11,$12);
+}
+| CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec SERVER name create_generic_options
+ {
+ $$ = cat_str(9,mm_strdup("create foreign table if not exists"),$7,mm_strdup("partition of"),$10,$11,$12,mm_strdup("server"),$14,$15);
+}
+;
+
+
+ ImportForeignSchemaStmt:
+ IMPORT_P FOREIGN SCHEMA name import_qualification FROM SERVER name INTO name create_generic_options
+ {
+ $$ = cat_str(8,mm_strdup("import foreign schema"),$4,$5,mm_strdup("from server"),$8,mm_strdup("into"),$10,$11);
+}
+;
+
+
+ import_qualification_type:
+ LIMIT TO
+ {
+ $$ = mm_strdup("limit to");
+}
+| EXCEPT
+ {
+ $$ = mm_strdup("except");
+}
+;
+
+
+ import_qualification:
+ import_qualification_type '(' relation_expr_list ')'
+ {
+ $$ = cat_str(4,$1,mm_strdup("("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ CreateUserMappingStmt:
+ CREATE USER MAPPING FOR auth_ident SERVER name create_generic_options
+ {
+ $$ = cat_str(5,mm_strdup("create user mapping for"),$5,mm_strdup("server"),$7,$8);
+}
+| CREATE USER MAPPING IF_P NOT EXISTS FOR auth_ident SERVER name create_generic_options
+ {
+ $$ = cat_str(5,mm_strdup("create user mapping if not exists for"),$8,mm_strdup("server"),$10,$11);
+}
+;
+
+
+ auth_ident:
+ RoleSpec
+ {
+ $$ = $1;
+}
+| USER
+ {
+ $$ = mm_strdup("user");
+}
+;
+
+
+ DropUserMappingStmt:
+ DROP USER MAPPING FOR auth_ident SERVER name
+ {
+ $$ = cat_str(4,mm_strdup("drop user mapping for"),$5,mm_strdup("server"),$7);
+}
+| DROP USER MAPPING IF_P EXISTS FOR auth_ident SERVER name
+ {
+ $$ = cat_str(4,mm_strdup("drop user mapping if exists for"),$7,mm_strdup("server"),$9);
+}
+;
+
+
+ AlterUserMappingStmt:
+ ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options
+ {
+ $$ = cat_str(5,mm_strdup("alter user mapping for"),$5,mm_strdup("server"),$7,$8);
+}
+;
+
+
+ CreatePolicyStmt:
+ CREATE POLICY name ON qualified_name RowSecurityDefaultPermissive RowSecurityDefaultForCmd RowSecurityDefaultToRole RowSecurityOptionalExpr RowSecurityOptionalWithCheck
+ {
+ $$ = cat_str(9,mm_strdup("create policy"),$3,mm_strdup("on"),$5,$6,$7,$8,$9,$10);
+}
+;
+
+
+ AlterPolicyStmt:
+ ALTER POLICY name ON qualified_name RowSecurityOptionalToRole RowSecurityOptionalExpr RowSecurityOptionalWithCheck
+ {
+ $$ = cat_str(7,mm_strdup("alter policy"),$3,mm_strdup("on"),$5,$6,$7,$8);
+}
+;
+
+
+ RowSecurityOptionalExpr:
+ USING '(' a_expr ')'
+ {
+ $$ = cat_str(3,mm_strdup("using ("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ RowSecurityOptionalWithCheck:
+ WITH CHECK '(' a_expr ')'
+ {
+ $$ = cat_str(3,mm_strdup("with check ("),$4,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ RowSecurityDefaultToRole:
+ TO role_list
+ {
+ $$ = cat_str(2,mm_strdup("to"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ RowSecurityOptionalToRole:
+ TO role_list
+ {
+ $$ = cat_str(2,mm_strdup("to"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ RowSecurityDefaultPermissive:
+ AS ecpg_ident
+ {
+ $$ = cat_str(2,mm_strdup("as"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ RowSecurityDefaultForCmd:
+ FOR row_security_cmd
+ {
+ $$ = cat_str(2,mm_strdup("for"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ row_security_cmd:
+ ALL
+ {
+ $$ = mm_strdup("all");
+}
+| SELECT
+ {
+ $$ = mm_strdup("select");
+}
+| INSERT
+ {
+ $$ = mm_strdup("insert");
+}
+| UPDATE
+ {
+ $$ = mm_strdup("update");
+}
+| DELETE_P
+ {
+ $$ = mm_strdup("delete");
+}
+;
+
+
+ CreateAmStmt:
+ CREATE ACCESS METHOD name TYPE_P am_type HANDLER handler_name
+ {
+ $$ = cat_str(6,mm_strdup("create access method"),$4,mm_strdup("type"),$6,mm_strdup("handler"),$8);
+}
+;
+
+
+ am_type:
+ INDEX
+ {
+ $$ = mm_strdup("index");
+}
+| TABLE
+ {
+ $$ = mm_strdup("table");
+}
+;
+
+
+ CreateTrigStmt:
+ CREATE opt_or_replace TRIGGER name TriggerActionTime TriggerEvents ON qualified_name TriggerReferencing TriggerForSpec TriggerWhen EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
+ {
+ $$ = cat_str(17,mm_strdup("create"),$2,mm_strdup("trigger"),$4,$5,$6,mm_strdup("on"),$8,$9,$10,$11,mm_strdup("execute"),$13,$14,mm_strdup("("),$16,mm_strdup(")"));
+}
+| 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 ')'
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = cat_str(18,mm_strdup("create"),$2,mm_strdup("constraint trigger"),$5,mm_strdup("after"),$7,mm_strdup("on"),$9,$10,$11,mm_strdup("for each row"),$15,mm_strdup("execute"),$17,$18,mm_strdup("("),$20,mm_strdup(")"));
+}
+;
+
+
+ TriggerActionTime:
+ BEFORE
+ {
+ $$ = mm_strdup("before");
+}
+| AFTER
+ {
+ $$ = mm_strdup("after");
+}
+| INSTEAD OF
+ {
+ $$ = mm_strdup("instead of");
+}
+;
+
+
+ TriggerEvents:
+ TriggerOneEvent
+ {
+ $$ = $1;
+}
+| TriggerEvents OR TriggerOneEvent
+ {
+ $$ = cat_str(3,$1,mm_strdup("or"),$3);
+}
+;
+
+
+ TriggerOneEvent:
+ INSERT
+ {
+ $$ = mm_strdup("insert");
+}
+| DELETE_P
+ {
+ $$ = mm_strdup("delete");
+}
+| UPDATE
+ {
+ $$ = mm_strdup("update");
+}
+| UPDATE OF columnList
+ {
+ $$ = cat_str(2,mm_strdup("update of"),$3);
+}
+| TRUNCATE
+ {
+ $$ = mm_strdup("truncate");
+}
+;
+
+
+ TriggerReferencing:
+ REFERENCING TriggerTransitions
+ {
+ $$ = cat_str(2,mm_strdup("referencing"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ TriggerTransitions:
+ TriggerTransition
+ {
+ $$ = $1;
+}
+| TriggerTransitions TriggerTransition
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ TriggerTransition:
+ TransitionOldOrNew TransitionRowOrTable opt_as TransitionRelName
+ {
+ $$ = cat_str(4,$1,$2,$3,$4);
+}
+;
+
+
+ TransitionOldOrNew:
+ NEW
+ {
+ $$ = mm_strdup("new");
+}
+| OLD
+ {
+ $$ = mm_strdup("old");
+}
+;
+
+
+ TransitionRowOrTable:
+ TABLE
+ {
+ $$ = mm_strdup("table");
+}
+| ROW
+ {
+ $$ = mm_strdup("row");
+}
+;
+
+
+ TransitionRelName:
+ ColId
+ {
+ $$ = $1;
+}
+;
+
+
+ TriggerForSpec:
+ FOR TriggerForOptEach TriggerForType
+ {
+ $$ = cat_str(3,mm_strdup("for"),$2,$3);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ TriggerForOptEach:
+ EACH
+ {
+ $$ = mm_strdup("each");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ TriggerForType:
+ ROW
+ {
+ $$ = mm_strdup("row");
+}
+| STATEMENT
+ {
+ $$ = mm_strdup("statement");
+}
+;
+
+
+ TriggerWhen:
+ WHEN '(' a_expr ')'
+ {
+ $$ = cat_str(3,mm_strdup("when ("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ FUNCTION_or_PROCEDURE:
+ FUNCTION
+ {
+ $$ = mm_strdup("function");
+}
+| PROCEDURE
+ {
+ $$ = mm_strdup("procedure");
+}
+;
+
+
+ TriggerFuncArgs:
+ TriggerFuncArg
+ {
+ $$ = $1;
+}
+| TriggerFuncArgs ',' TriggerFuncArg
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ TriggerFuncArg:
+ Iconst
+ {
+ $$ = $1;
+}
+| ecpg_fconst
+ {
+ $$ = $1;
+}
+| ecpg_sconst
+ {
+ $$ = $1;
+}
+| ColLabel
+ {
+ $$ = $1;
+}
+;
+
+
+ OptConstrFromTable:
+ FROM qualified_name
+ {
+ $$ = cat_str(2,mm_strdup("from"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ ConstraintAttributeSpec:
+
+ {
+ $$=EMPTY; }
+| ConstraintAttributeSpec ConstraintAttributeElem
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ ConstraintAttributeElem:
+ NOT DEFERRABLE
+ {
+ $$ = mm_strdup("not deferrable");
+}
+| DEFERRABLE
+ {
+ $$ = mm_strdup("deferrable");
+}
+| INITIALLY IMMEDIATE
+ {
+ $$ = mm_strdup("initially immediate");
+}
+| INITIALLY DEFERRED
+ {
+ $$ = mm_strdup("initially deferred");
+}
+| NOT VALID
+ {
+ $$ = mm_strdup("not valid");
+}
+| NO INHERIT
+ {
+ $$ = mm_strdup("no inherit");
+}
+;
+
+
+ CreateEventTrigStmt:
+ CREATE EVENT TRIGGER name ON ColLabel EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
+ {
+ $$ = cat_str(8,mm_strdup("create event trigger"),$4,mm_strdup("on"),$6,mm_strdup("execute"),$8,$9,mm_strdup("( )"));
+}
+| CREATE EVENT TRIGGER name ON ColLabel WHEN event_trigger_when_list EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
+ {
+ $$ = cat_str(10,mm_strdup("create event trigger"),$4,mm_strdup("on"),$6,mm_strdup("when"),$8,mm_strdup("execute"),$10,$11,mm_strdup("( )"));
+}
+;
+
+
+ event_trigger_when_list:
+ event_trigger_when_item
+ {
+ $$ = $1;
+}
+| event_trigger_when_list AND event_trigger_when_item
+ {
+ $$ = cat_str(3,$1,mm_strdup("and"),$3);
+}
+;
+
+
+ event_trigger_when_item:
+ ColId IN_P '(' event_trigger_value_list ')'
+ {
+ $$ = cat_str(4,$1,mm_strdup("in ("),$4,mm_strdup(")"));
+}
+;
+
+
+ event_trigger_value_list:
+ SCONST
+ {
+ $$ = mm_strdup("sconst");
+}
+| event_trigger_value_list ',' SCONST
+ {
+ $$ = cat_str(2,$1,mm_strdup(", sconst"));
+}
+;
+
+
+ AlterEventTrigStmt:
+ ALTER EVENT TRIGGER name enable_trigger
+ {
+ $$ = cat_str(3,mm_strdup("alter event trigger"),$4,$5);
+}
+;
+
+
+ enable_trigger:
+ ENABLE_P
+ {
+ $$ = mm_strdup("enable");
+}
+| ENABLE_P REPLICA
+ {
+ $$ = mm_strdup("enable replica");
+}
+| ENABLE_P ALWAYS
+ {
+ $$ = mm_strdup("enable always");
+}
+| DISABLE_P
+ {
+ $$ = mm_strdup("disable");
+}
+;
+
+
+ CreateAssertionStmt:
+ CREATE ASSERTION any_name CHECK '(' a_expr ')' ConstraintAttributeSpec
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = cat_str(6,mm_strdup("create assertion"),$3,mm_strdup("check ("),$6,mm_strdup(")"),$8);
+}
+;
+
+
+ DefineStmt:
+ CREATE opt_or_replace AGGREGATE func_name aggr_args definition
+ {
+ $$ = cat_str(6,mm_strdup("create"),$2,mm_strdup("aggregate"),$4,$5,$6);
+}
+| CREATE opt_or_replace AGGREGATE func_name old_aggr_definition
+ {
+ $$ = cat_str(5,mm_strdup("create"),$2,mm_strdup("aggregate"),$4,$5);
+}
+| CREATE OPERATOR any_operator definition
+ {
+ $$ = cat_str(3,mm_strdup("create operator"),$3,$4);
+}
+| CREATE TYPE_P any_name definition
+ {
+ $$ = cat_str(3,mm_strdup("create type"),$3,$4);
+}
+| CREATE TYPE_P any_name
+ {
+ $$ = cat_str(2,mm_strdup("create type"),$3);
+}
+| CREATE TYPE_P any_name AS '(' OptTableFuncElementList ')'
+ {
+ $$ = cat_str(5,mm_strdup("create type"),$3,mm_strdup("as ("),$6,mm_strdup(")"));
+}
+| CREATE TYPE_P any_name AS ENUM_P '(' opt_enum_val_list ')'
+ {
+ $$ = cat_str(5,mm_strdup("create type"),$3,mm_strdup("as enum ("),$7,mm_strdup(")"));
+}
+| CREATE TYPE_P any_name AS RANGE definition
+ {
+ $$ = cat_str(4,mm_strdup("create type"),$3,mm_strdup("as range"),$6);
+}
+| CREATE TEXT_P SEARCH PARSER any_name definition
+ {
+ $$ = cat_str(3,mm_strdup("create text search parser"),$5,$6);
+}
+| CREATE TEXT_P SEARCH DICTIONARY any_name definition
+ {
+ $$ = cat_str(3,mm_strdup("create text search dictionary"),$5,$6);
+}
+| CREATE TEXT_P SEARCH TEMPLATE any_name definition
+ {
+ $$ = cat_str(3,mm_strdup("create text search template"),$5,$6);
+}
+| CREATE TEXT_P SEARCH CONFIGURATION any_name definition
+ {
+ $$ = cat_str(3,mm_strdup("create text search configuration"),$5,$6);
+}
+| CREATE COLLATION any_name definition
+ {
+ $$ = cat_str(3,mm_strdup("create collation"),$3,$4);
+}
+| CREATE COLLATION IF_P NOT EXISTS any_name definition
+ {
+ $$ = cat_str(3,mm_strdup("create collation if not exists"),$6,$7);
+}
+| CREATE COLLATION any_name FROM any_name
+ {
+ $$ = cat_str(4,mm_strdup("create collation"),$3,mm_strdup("from"),$5);
+}
+| CREATE COLLATION IF_P NOT EXISTS any_name FROM any_name
+ {
+ $$ = cat_str(4,mm_strdup("create collation if not exists"),$6,mm_strdup("from"),$8);
+}
+;
+
+
+ definition:
+ '(' def_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+;
+
+
+ def_list:
+ def_elem
+ {
+ $$ = $1;
+}
+| def_list ',' def_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ def_elem:
+ ColLabel '=' def_arg
+ {
+ $$ = cat_str(3,$1,mm_strdup("="),$3);
+}
+| ColLabel
+ {
+ $$ = $1;
+}
+;
+
+
+ def_arg:
+ func_type
+ {
+ $$ = $1;
+}
+| reserved_keyword
+ {
+ $$ = $1;
+}
+| qual_all_Op
+ {
+ $$ = $1;
+}
+| NumericOnly
+ {
+ $$ = $1;
+}
+| ecpg_sconst
+ {
+ $$ = $1;
+}
+| NONE
+ {
+ $$ = mm_strdup("none");
+}
+;
+
+
+ old_aggr_definition:
+ '(' old_aggr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+;
+
+
+ old_aggr_list:
+ old_aggr_elem
+ {
+ $$ = $1;
+}
+| old_aggr_list ',' old_aggr_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ old_aggr_elem:
+ ecpg_ident '=' def_arg
+ {
+ $$ = cat_str(3,$1,mm_strdup("="),$3);
+}
+;
+
+
+ opt_enum_val_list:
+ enum_val_list
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ enum_val_list:
+ ecpg_sconst
+ {
+ $$ = $1;
+}
+| enum_val_list ',' ecpg_sconst
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ AlterEnumStmt:
+ ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists ecpg_sconst
+ {
+ $$ = cat_str(5,mm_strdup("alter type"),$3,mm_strdup("add value"),$6,$7);
+}
+| ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists ecpg_sconst BEFORE ecpg_sconst
+ {
+ $$ = cat_str(7,mm_strdup("alter type"),$3,mm_strdup("add value"),$6,$7,mm_strdup("before"),$9);
+}
+| ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists ecpg_sconst AFTER ecpg_sconst
+ {
+ $$ = cat_str(7,mm_strdup("alter type"),$3,mm_strdup("add value"),$6,$7,mm_strdup("after"),$9);
+}
+| ALTER TYPE_P any_name RENAME VALUE_P ecpg_sconst TO ecpg_sconst
+ {
+ $$ = cat_str(6,mm_strdup("alter type"),$3,mm_strdup("rename value"),$6,mm_strdup("to"),$8);
+}
+;
+
+
+ opt_if_not_exists:
+ IF_P NOT EXISTS
+ {
+ $$ = mm_strdup("if not exists");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ CreateOpClassStmt:
+ CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename USING name opt_opfamily AS opclass_item_list
+ {
+ $$ = cat_str(10,mm_strdup("create operator class"),$4,$5,mm_strdup("for type"),$8,mm_strdup("using"),$10,$11,mm_strdup("as"),$13);
+}
+;
+
+
+ opclass_item_list:
+ opclass_item
+ {
+ $$ = $1;
+}
+| opclass_item_list ',' opclass_item
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ opclass_item:
+ OPERATOR Iconst any_operator opclass_purpose opt_recheck
+ {
+ $$ = cat_str(5,mm_strdup("operator"),$2,$3,$4,$5);
+}
+| OPERATOR Iconst operator_with_argtypes opclass_purpose opt_recheck
+ {
+ $$ = cat_str(5,mm_strdup("operator"),$2,$3,$4,$5);
+}
+| FUNCTION Iconst function_with_argtypes
+ {
+ $$ = cat_str(3,mm_strdup("function"),$2,$3);
+}
+| FUNCTION Iconst '(' type_list ')' function_with_argtypes
+ {
+ $$ = cat_str(6,mm_strdup("function"),$2,mm_strdup("("),$4,mm_strdup(")"),$6);
+}
+| STORAGE Typename
+ {
+ $$ = cat_str(2,mm_strdup("storage"),$2);
+}
+;
+
+
+ opt_default:
+ DEFAULT
+ {
+ $$ = mm_strdup("default");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_opfamily:
+ FAMILY any_name
+ {
+ $$ = cat_str(2,mm_strdup("family"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opclass_purpose:
+ FOR SEARCH
+ {
+ $$ = mm_strdup("for search");
+}
+| FOR ORDER BY any_name
+ {
+ $$ = cat_str(2,mm_strdup("for order by"),$4);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_recheck:
+ RECHECK
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = mm_strdup("recheck");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ CreateOpFamilyStmt:
+ CREATE OPERATOR FAMILY any_name USING name
+ {
+ $$ = cat_str(4,mm_strdup("create operator family"),$4,mm_strdup("using"),$6);
+}
+;
+
+
+ AlterOpFamilyStmt:
+ ALTER OPERATOR FAMILY any_name USING name ADD_P opclass_item_list
+ {
+ $$ = cat_str(6,mm_strdup("alter operator family"),$4,mm_strdup("using"),$6,mm_strdup("add"),$8);
+}
+| ALTER OPERATOR FAMILY any_name USING name DROP opclass_drop_list
+ {
+ $$ = cat_str(6,mm_strdup("alter operator family"),$4,mm_strdup("using"),$6,mm_strdup("drop"),$8);
+}
+;
+
+
+ opclass_drop_list:
+ opclass_drop
+ {
+ $$ = $1;
+}
+| opclass_drop_list ',' opclass_drop
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ opclass_drop:
+ OPERATOR Iconst '(' type_list ')'
+ {
+ $$ = cat_str(5,mm_strdup("operator"),$2,mm_strdup("("),$4,mm_strdup(")"));
+}
+| FUNCTION Iconst '(' type_list ')'
+ {
+ $$ = cat_str(5,mm_strdup("function"),$2,mm_strdup("("),$4,mm_strdup(")"));
+}
+;
+
+
+ DropOpClassStmt:
+ DROP OPERATOR CLASS any_name USING name opt_drop_behavior
+ {
+ $$ = cat_str(5,mm_strdup("drop operator class"),$4,mm_strdup("using"),$6,$7);
+}
+| DROP OPERATOR CLASS IF_P EXISTS any_name USING name opt_drop_behavior
+ {
+ $$ = cat_str(5,mm_strdup("drop operator class if exists"),$6,mm_strdup("using"),$8,$9);
+}
+;
+
+
+ DropOpFamilyStmt:
+ DROP OPERATOR FAMILY any_name USING name opt_drop_behavior
+ {
+ $$ = cat_str(5,mm_strdup("drop operator family"),$4,mm_strdup("using"),$6,$7);
+}
+| DROP OPERATOR FAMILY IF_P EXISTS any_name USING name opt_drop_behavior
+ {
+ $$ = cat_str(5,mm_strdup("drop operator family if exists"),$6,mm_strdup("using"),$8,$9);
+}
+;
+
+
+ DropOwnedStmt:
+ DROP OWNED BY role_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop owned by"),$4,$5);
+}
+;
+
+
+ ReassignOwnedStmt:
+ REASSIGN OWNED BY role_list TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("reassign owned by"),$4,mm_strdup("to"),$6);
+}
+;
+
+
+ DropStmt:
+ DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior
+ {
+ $$ = cat_str(5,mm_strdup("drop"),$2,mm_strdup("if exists"),$5,$6);
+}
+| DROP object_type_any_name any_name_list opt_drop_behavior
+ {
+ $$ = cat_str(4,mm_strdup("drop"),$2,$3,$4);
+}
+| DROP drop_type_name IF_P EXISTS name_list opt_drop_behavior
+ {
+ $$ = cat_str(5,mm_strdup("drop"),$2,mm_strdup("if exists"),$5,$6);
+}
+| DROP drop_type_name name_list opt_drop_behavior
+ {
+ $$ = cat_str(4,mm_strdup("drop"),$2,$3,$4);
+}
+| DROP object_type_name_on_any_name name ON any_name opt_drop_behavior
+ {
+ $$ = cat_str(6,mm_strdup("drop"),$2,$3,mm_strdup("on"),$5,$6);
+}
+| DROP object_type_name_on_any_name IF_P EXISTS name ON any_name opt_drop_behavior
+ {
+ $$ = cat_str(7,mm_strdup("drop"),$2,mm_strdup("if exists"),$5,mm_strdup("on"),$7,$8);
+}
+| DROP TYPE_P type_name_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop type"),$3,$4);
+}
+| DROP TYPE_P IF_P EXISTS type_name_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop type if exists"),$5,$6);
+}
+| DROP DOMAIN_P type_name_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop domain"),$3,$4);
+}
+| DROP DOMAIN_P IF_P EXISTS type_name_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop domain if exists"),$5,$6);
+}
+| DROP INDEX CONCURRENTLY any_name_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop index concurrently"),$4,$5);
+}
+| DROP INDEX CONCURRENTLY IF_P EXISTS any_name_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop index concurrently if exists"),$6,$7);
+}
+;
+
+
+ object_type_any_name:
+ TABLE
+ {
+ $$ = mm_strdup("table");
+}
+| SEQUENCE
+ {
+ $$ = mm_strdup("sequence");
+}
+| VIEW
+ {
+ $$ = mm_strdup("view");
+}
+| MATERIALIZED VIEW
+ {
+ $$ = mm_strdup("materialized view");
+}
+| INDEX
+ {
+ $$ = mm_strdup("index");
+}
+| FOREIGN TABLE
+ {
+ $$ = mm_strdup("foreign table");
+}
+| COLLATION
+ {
+ $$ = mm_strdup("collation");
+}
+| CONVERSION_P
+ {
+ $$ = mm_strdup("conversion");
+}
+| STATISTICS
+ {
+ $$ = mm_strdup("statistics");
+}
+| TEXT_P SEARCH PARSER
+ {
+ $$ = mm_strdup("text search parser");
+}
+| TEXT_P SEARCH DICTIONARY
+ {
+ $$ = mm_strdup("text search dictionary");
+}
+| TEXT_P SEARCH TEMPLATE
+ {
+ $$ = mm_strdup("text search template");
+}
+| TEXT_P SEARCH CONFIGURATION
+ {
+ $$ = mm_strdup("text search configuration");
+}
+;
+
+
+ object_type_name:
+ drop_type_name
+ {
+ $$ = $1;
+}
+| DATABASE
+ {
+ $$ = mm_strdup("database");
+}
+| ROLE
+ {
+ $$ = mm_strdup("role");
+}
+| SUBSCRIPTION
+ {
+ $$ = mm_strdup("subscription");
+}
+| TABLESPACE
+ {
+ $$ = mm_strdup("tablespace");
+}
+;
+
+
+ drop_type_name:
+ ACCESS METHOD
+ {
+ $$ = mm_strdup("access method");
+}
+| EVENT TRIGGER
+ {
+ $$ = mm_strdup("event trigger");
+}
+| EXTENSION
+ {
+ $$ = mm_strdup("extension");
+}
+| FOREIGN DATA_P WRAPPER
+ {
+ $$ = mm_strdup("foreign data wrapper");
+}
+| opt_procedural LANGUAGE
+ {
+ $$ = cat_str(2,$1,mm_strdup("language"));
+}
+| PUBLICATION
+ {
+ $$ = mm_strdup("publication");
+}
+| SCHEMA
+ {
+ $$ = mm_strdup("schema");
+}
+| SERVER
+ {
+ $$ = mm_strdup("server");
+}
+;
+
+
+ object_type_name_on_any_name:
+ POLICY
+ {
+ $$ = mm_strdup("policy");
+}
+| RULE
+ {
+ $$ = mm_strdup("rule");
+}
+| TRIGGER
+ {
+ $$ = mm_strdup("trigger");
+}
+;
+
+
+ any_name_list:
+ any_name
+ {
+ $$ = $1;
+}
+| any_name_list ',' any_name
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ any_name:
+ ColId
+ {
+ $$ = $1;
+}
+| ColId attrs
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ attrs:
+ '.' attr_name
+ {
+ $$ = cat_str(2,mm_strdup("."),$2);
+}
+| attrs '.' attr_name
+ {
+ $$ = cat_str(3,$1,mm_strdup("."),$3);
+}
+;
+
+
+ type_name_list:
+ Typename
+ {
+ $$ = $1;
+}
+| type_name_list ',' Typename
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ TruncateStmt:
+ TRUNCATE opt_table relation_expr_list opt_restart_seqs opt_drop_behavior
+ {
+ $$ = cat_str(5,mm_strdup("truncate"),$2,$3,$4,$5);
+}
+;
+
+
+ opt_restart_seqs:
+ CONTINUE_P IDENTITY_P
+ {
+ $$ = mm_strdup("continue identity");
+}
+| RESTART IDENTITY_P
+ {
+ $$ = mm_strdup("restart identity");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ CommentStmt:
+ COMMENT ON object_type_any_name any_name IS comment_text
+ {
+ $$ = cat_str(5,mm_strdup("comment on"),$3,$4,mm_strdup("is"),$6);
+}
+| COMMENT ON COLUMN any_name IS comment_text
+ {
+ $$ = cat_str(4,mm_strdup("comment on column"),$4,mm_strdup("is"),$6);
+}
+| COMMENT ON object_type_name name IS comment_text
+ {
+ $$ = cat_str(5,mm_strdup("comment on"),$3,$4,mm_strdup("is"),$6);
+}
+| COMMENT ON TYPE_P Typename IS comment_text
+ {
+ $$ = cat_str(4,mm_strdup("comment on type"),$4,mm_strdup("is"),$6);
+}
+| COMMENT ON DOMAIN_P Typename IS comment_text
+ {
+ $$ = cat_str(4,mm_strdup("comment on domain"),$4,mm_strdup("is"),$6);
+}
+| COMMENT ON AGGREGATE aggregate_with_argtypes IS comment_text
+ {
+ $$ = cat_str(4,mm_strdup("comment on aggregate"),$4,mm_strdup("is"),$6);
+}
+| COMMENT ON FUNCTION function_with_argtypes IS comment_text
+ {
+ $$ = cat_str(4,mm_strdup("comment on function"),$4,mm_strdup("is"),$6);
+}
+| COMMENT ON OPERATOR operator_with_argtypes IS comment_text
+ {
+ $$ = cat_str(4,mm_strdup("comment on operator"),$4,mm_strdup("is"),$6);
+}
+| COMMENT ON CONSTRAINT name ON any_name IS comment_text
+ {
+ $$ = cat_str(6,mm_strdup("comment on constraint"),$4,mm_strdup("on"),$6,mm_strdup("is"),$8);
+}
+| COMMENT ON CONSTRAINT name ON DOMAIN_P any_name IS comment_text
+ {
+ $$ = cat_str(6,mm_strdup("comment on constraint"),$4,mm_strdup("on domain"),$7,mm_strdup("is"),$9);
+}
+| COMMENT ON object_type_name_on_any_name name ON any_name IS comment_text
+ {
+ $$ = cat_str(7,mm_strdup("comment on"),$3,$4,mm_strdup("on"),$6,mm_strdup("is"),$8);
+}
+| COMMENT ON PROCEDURE function_with_argtypes IS comment_text
+ {
+ $$ = cat_str(4,mm_strdup("comment on procedure"),$4,mm_strdup("is"),$6);
+}
+| COMMENT ON ROUTINE function_with_argtypes IS comment_text
+ {
+ $$ = cat_str(4,mm_strdup("comment on routine"),$4,mm_strdup("is"),$6);
+}
+| COMMENT ON TRANSFORM FOR Typename LANGUAGE name IS comment_text
+ {
+ $$ = cat_str(6,mm_strdup("comment on transform for"),$5,mm_strdup("language"),$7,mm_strdup("is"),$9);
+}
+| COMMENT ON OPERATOR CLASS any_name USING name IS comment_text
+ {
+ $$ = cat_str(6,mm_strdup("comment on operator class"),$5,mm_strdup("using"),$7,mm_strdup("is"),$9);
+}
+| COMMENT ON OPERATOR FAMILY any_name USING name IS comment_text
+ {
+ $$ = cat_str(6,mm_strdup("comment on operator family"),$5,mm_strdup("using"),$7,mm_strdup("is"),$9);
+}
+| COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
+ {
+ $$ = cat_str(4,mm_strdup("comment on large object"),$5,mm_strdup("is"),$7);
+}
+| COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
+ {
+ $$ = cat_str(6,mm_strdup("comment on cast ("),$5,mm_strdup("as"),$7,mm_strdup(") is"),$10);
+}
+;
+
+
+ comment_text:
+ ecpg_sconst
+ {
+ $$ = $1;
+}
+| NULL_P
+ {
+ $$ = mm_strdup("null");
+}
+;
+
+
+ SecLabelStmt:
+ SECURITY LABEL opt_provider ON object_type_any_name any_name IS security_label
+ {
+ $$ = cat_str(7,mm_strdup("security label"),$3,mm_strdup("on"),$5,$6,mm_strdup("is"),$8);
+}
+| SECURITY LABEL opt_provider ON COLUMN any_name IS security_label
+ {
+ $$ = cat_str(6,mm_strdup("security label"),$3,mm_strdup("on column"),$6,mm_strdup("is"),$8);
+}
+| SECURITY LABEL opt_provider ON object_type_name name IS security_label
+ {
+ $$ = cat_str(7,mm_strdup("security label"),$3,mm_strdup("on"),$5,$6,mm_strdup("is"),$8);
+}
+| SECURITY LABEL opt_provider ON TYPE_P Typename IS security_label
+ {
+ $$ = cat_str(6,mm_strdup("security label"),$3,mm_strdup("on type"),$6,mm_strdup("is"),$8);
+}
+| SECURITY LABEL opt_provider ON DOMAIN_P Typename IS security_label
+ {
+ $$ = cat_str(6,mm_strdup("security label"),$3,mm_strdup("on domain"),$6,mm_strdup("is"),$8);
+}
+| SECURITY LABEL opt_provider ON AGGREGATE aggregate_with_argtypes IS security_label
+ {
+ $$ = cat_str(6,mm_strdup("security label"),$3,mm_strdup("on aggregate"),$6,mm_strdup("is"),$8);
+}
+| SECURITY LABEL opt_provider ON FUNCTION function_with_argtypes IS security_label
+ {
+ $$ = cat_str(6,mm_strdup("security label"),$3,mm_strdup("on function"),$6,mm_strdup("is"),$8);
+}
+| SECURITY LABEL opt_provider ON LARGE_P OBJECT_P NumericOnly IS security_label
+ {
+ $$ = cat_str(6,mm_strdup("security label"),$3,mm_strdup("on large object"),$7,mm_strdup("is"),$9);
+}
+| SECURITY LABEL opt_provider ON PROCEDURE function_with_argtypes IS security_label
+ {
+ $$ = cat_str(6,mm_strdup("security label"),$3,mm_strdup("on procedure"),$6,mm_strdup("is"),$8);
+}
+| SECURITY LABEL opt_provider ON ROUTINE function_with_argtypes IS security_label
+ {
+ $$ = cat_str(6,mm_strdup("security label"),$3,mm_strdup("on routine"),$6,mm_strdup("is"),$8);
+}
+;
+
+
+ opt_provider:
+ FOR NonReservedWord_or_Sconst
+ {
+ $$ = cat_str(2,mm_strdup("for"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ security_label:
+ ecpg_sconst
+ {
+ $$ = $1;
+}
+| NULL_P
+ {
+ $$ = mm_strdup("null");
+}
+;
+
+
+ FetchStmt:
+ FETCH fetch_args
+ {
+ $$ = cat_str(2,mm_strdup("fetch"),$2);
+}
+| MOVE fetch_args
+ {
+ $$ = cat_str(2,mm_strdup("move"),$2);
+}
+ | FETCH fetch_args ecpg_fetch_into
+ {
+ $$ = cat2_str(mm_strdup("fetch"), $2);
+ }
+ | FETCH FORWARD cursor_name opt_ecpg_fetch_into
+ {
+ char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
+ struct cursor *ptr = add_additional_variables($3, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ $$ = cat_str(2, mm_strdup("fetch forward"), cursor_marker);
+ }
+ | FETCH FORWARD from_in cursor_name opt_ecpg_fetch_into
+ {
+ char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
+ struct cursor *ptr = add_additional_variables($4, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ $$ = cat_str(2, mm_strdup("fetch forward from"), cursor_marker);
+ }
+ | FETCH BACKWARD cursor_name opt_ecpg_fetch_into
+ {
+ char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
+ struct cursor *ptr = add_additional_variables($3, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ $$ = cat_str(2, mm_strdup("fetch backward"), cursor_marker);
+ }
+ | FETCH BACKWARD from_in cursor_name opt_ecpg_fetch_into
+ {
+ char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
+ struct cursor *ptr = add_additional_variables($4, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ $$ = cat_str(2, mm_strdup("fetch backward from"), cursor_marker);
+ }
+ | MOVE FORWARD cursor_name
+ {
+ char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
+ struct cursor *ptr = add_additional_variables($3, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ $$ = cat_str(2, mm_strdup("move forward"), cursor_marker);
+ }
+ | MOVE FORWARD from_in cursor_name
+ {
+ char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
+ struct cursor *ptr = add_additional_variables($4, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ $$ = cat_str(2, mm_strdup("move forward from"), cursor_marker);
+ }
+ | MOVE BACKWARD cursor_name
+ {
+ char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
+ struct cursor *ptr = add_additional_variables($3, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ $$ = cat_str(2, mm_strdup("move backward"), cursor_marker);
+ }
+ | MOVE BACKWARD from_in cursor_name
+ {
+ char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
+ struct cursor *ptr = add_additional_variables($4, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ $$ = cat_str(2, mm_strdup("move backward from"), cursor_marker);
+ }
+;
+
+
+ fetch_args:
+ cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($1, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($1[0] == ':')
+ {
+ free($1);
+ $1 = mm_strdup("$0");
+ }
+
+ $$ = $1;
+}
+| from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($2, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($2[0] == ':')
+ {
+ free($2);
+ $2 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(2,$1,$2);
+}
+| NEXT opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($3, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($3[0] == ':')
+ {
+ free($3);
+ $3 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(3,mm_strdup("next"),$2,$3);
+}
+| PRIOR opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($3, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($3[0] == ':')
+ {
+ free($3);
+ $3 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(3,mm_strdup("prior"),$2,$3);
+}
+| FIRST_P opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($3, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($3[0] == ':')
+ {
+ free($3);
+ $3 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(3,mm_strdup("first"),$2,$3);
+}
+| LAST_P opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($3, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($3[0] == ':')
+ {
+ free($3);
+ $3 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(3,mm_strdup("last"),$2,$3);
+}
+| ABSOLUTE_P SignedIconst opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($4, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($4[0] == ':')
+ {
+ free($4);
+ $4 = mm_strdup("$0");
+ }
+ if ($2[0] == '$')
+ {
+ free($2);
+ $2 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(4,mm_strdup("absolute"),$2,$3,$4);
+}
+| RELATIVE_P SignedIconst opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($4, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($4[0] == ':')
+ {
+ free($4);
+ $4 = mm_strdup("$0");
+ }
+ if ($2[0] == '$')
+ {
+ free($2);
+ $2 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(4,mm_strdup("relative"),$2,$3,$4);
+}
+| SignedIconst opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($3, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($3[0] == ':')
+ {
+ free($3);
+ $3 = mm_strdup("$0");
+ }
+ if ($1[0] == '$')
+ {
+ free($1);
+ $1 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(3,$1,$2,$3);
+}
+| ALL opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($3, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($3[0] == ':')
+ {
+ free($3);
+ $3 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(3,mm_strdup("all"),$2,$3);
+}
+| FORWARD SignedIconst opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($4, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($4[0] == ':')
+ {
+ free($4);
+ $4 = mm_strdup("$0");
+ }
+ if ($2[0] == '$')
+ {
+ free($2);
+ $2 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(4,mm_strdup("forward"),$2,$3,$4);
+}
+| FORWARD ALL opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($4, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($4[0] == ':')
+ {
+ free($4);
+ $4 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(3,mm_strdup("forward all"),$3,$4);
+}
+| BACKWARD SignedIconst opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($4, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($4[0] == ':')
+ {
+ free($4);
+ $4 = mm_strdup("$0");
+ }
+ if ($2[0] == '$')
+ {
+ free($2);
+ $2 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(4,mm_strdup("backward"),$2,$3,$4);
+}
+| BACKWARD ALL opt_from_in cursor_name
+ {
+ struct cursor *ptr = add_additional_variables($4, false);
+ if (ptr -> connection)
+ connection = mm_strdup(ptr -> connection);
+
+ if ($4[0] == ':')
+ {
+ free($4);
+ $4 = mm_strdup("$0");
+ }
+
+ $$ = cat_str(3,mm_strdup("backward all"),$3,$4);
+}
+;
+
+
+ from_in:
+ FROM
+ {
+ $$ = mm_strdup("from");
+}
+| IN_P
+ {
+ $$ = mm_strdup("in");
+}
+;
+
+
+ opt_from_in:
+ from_in
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ GrantStmt:
+ GRANT privileges ON privilege_target TO grantee_list opt_grant_grant_option opt_granted_by
+ {
+ $$ = cat_str(8,mm_strdup("grant"),$2,mm_strdup("on"),$4,mm_strdup("to"),$6,$7,$8);
+}
+;
+
+
+ RevokeStmt:
+ REVOKE privileges ON privilege_target FROM grantee_list opt_granted_by opt_drop_behavior
+ {
+ $$ = cat_str(8,mm_strdup("revoke"),$2,mm_strdup("on"),$4,mm_strdup("from"),$6,$7,$8);
+}
+| REVOKE GRANT OPTION FOR privileges ON privilege_target FROM grantee_list opt_granted_by opt_drop_behavior
+ {
+ $$ = cat_str(8,mm_strdup("revoke grant option for"),$5,mm_strdup("on"),$7,mm_strdup("from"),$9,$10,$11);
+}
+;
+
+
+ privileges:
+ privilege_list
+ {
+ $$ = $1;
+}
+| ALL
+ {
+ $$ = mm_strdup("all");
+}
+| ALL PRIVILEGES
+ {
+ $$ = mm_strdup("all privileges");
+}
+| ALL '(' columnList ')'
+ {
+ $$ = cat_str(3,mm_strdup("all ("),$3,mm_strdup(")"));
+}
+| ALL PRIVILEGES '(' columnList ')'
+ {
+ $$ = cat_str(3,mm_strdup("all privileges ("),$4,mm_strdup(")"));
+}
+;
+
+
+ privilege_list:
+ privilege
+ {
+ $$ = $1;
+}
+| privilege_list ',' privilege
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ privilege:
+ SELECT opt_column_list
+ {
+ $$ = cat_str(2,mm_strdup("select"),$2);
+}
+| REFERENCES opt_column_list
+ {
+ $$ = cat_str(2,mm_strdup("references"),$2);
+}
+| CREATE opt_column_list
+ {
+ $$ = cat_str(2,mm_strdup("create"),$2);
+}
+| ColId opt_column_list
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ privilege_target:
+ qualified_name_list
+ {
+ $$ = $1;
+}
+| TABLE qualified_name_list
+ {
+ $$ = cat_str(2,mm_strdup("table"),$2);
+}
+| SEQUENCE qualified_name_list
+ {
+ $$ = cat_str(2,mm_strdup("sequence"),$2);
+}
+| FOREIGN DATA_P WRAPPER name_list
+ {
+ $$ = cat_str(2,mm_strdup("foreign data wrapper"),$4);
+}
+| FOREIGN SERVER name_list
+ {
+ $$ = cat_str(2,mm_strdup("foreign server"),$3);
+}
+| FUNCTION function_with_argtypes_list
+ {
+ $$ = cat_str(2,mm_strdup("function"),$2);
+}
+| PROCEDURE function_with_argtypes_list
+ {
+ $$ = cat_str(2,mm_strdup("procedure"),$2);
+}
+| ROUTINE function_with_argtypes_list
+ {
+ $$ = cat_str(2,mm_strdup("routine"),$2);
+}
+| DATABASE name_list
+ {
+ $$ = cat_str(2,mm_strdup("database"),$2);
+}
+| DOMAIN_P any_name_list
+ {
+ $$ = cat_str(2,mm_strdup("domain"),$2);
+}
+| LANGUAGE name_list
+ {
+ $$ = cat_str(2,mm_strdup("language"),$2);
+}
+| LARGE_P OBJECT_P NumericOnly_list
+ {
+ $$ = cat_str(2,mm_strdup("large object"),$3);
+}
+| SCHEMA name_list
+ {
+ $$ = cat_str(2,mm_strdup("schema"),$2);
+}
+| TABLESPACE name_list
+ {
+ $$ = cat_str(2,mm_strdup("tablespace"),$2);
+}
+| TYPE_P any_name_list
+ {
+ $$ = cat_str(2,mm_strdup("type"),$2);
+}
+| ALL TABLES IN_P SCHEMA name_list
+ {
+ $$ = cat_str(2,mm_strdup("all tables in schema"),$5);
+}
+| ALL SEQUENCES IN_P SCHEMA name_list
+ {
+ $$ = cat_str(2,mm_strdup("all sequences in schema"),$5);
+}
+| ALL FUNCTIONS IN_P SCHEMA name_list
+ {
+ $$ = cat_str(2,mm_strdup("all functions in schema"),$5);
+}
+| ALL PROCEDURES IN_P SCHEMA name_list
+ {
+ $$ = cat_str(2,mm_strdup("all procedures in schema"),$5);
+}
+| ALL ROUTINES IN_P SCHEMA name_list
+ {
+ $$ = cat_str(2,mm_strdup("all routines in schema"),$5);
+}
+;
+
+
+ grantee_list:
+ grantee
+ {
+ $$ = $1;
+}
+| grantee_list ',' grantee
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ grantee:
+ RoleSpec
+ {
+ $$ = $1;
+}
+| GROUP_P RoleSpec
+ {
+ $$ = cat_str(2,mm_strdup("group"),$2);
+}
+;
+
+
+ opt_grant_grant_option:
+ WITH GRANT OPTION
+ {
+ $$ = mm_strdup("with grant option");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ GrantRoleStmt:
+ GRANT privilege_list TO role_list opt_grant_admin_option opt_granted_by
+ {
+ $$ = cat_str(6,mm_strdup("grant"),$2,mm_strdup("to"),$4,$5,$6);
+}
+;
+
+
+ RevokeRoleStmt:
+ REVOKE privilege_list FROM role_list opt_granted_by opt_drop_behavior
+ {
+ $$ = cat_str(6,mm_strdup("revoke"),$2,mm_strdup("from"),$4,$5,$6);
+}
+| REVOKE ADMIN OPTION FOR privilege_list FROM role_list opt_granted_by opt_drop_behavior
+ {
+ $$ = cat_str(6,mm_strdup("revoke admin option for"),$5,mm_strdup("from"),$7,$8,$9);
+}
+;
+
+
+ opt_grant_admin_option:
+ WITH ADMIN OPTION
+ {
+ $$ = mm_strdup("with admin option");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_granted_by:
+ GRANTED BY RoleSpec
+ {
+ $$ = cat_str(2,mm_strdup("granted by"),$3);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ AlterDefaultPrivilegesStmt:
+ ALTER DEFAULT PRIVILEGES DefACLOptionList DefACLAction
+ {
+ $$ = cat_str(3,mm_strdup("alter default privileges"),$4,$5);
+}
+;
+
+
+ DefACLOptionList:
+ DefACLOptionList DefACLOption
+ {
+ $$ = cat_str(2,$1,$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ DefACLOption:
+ IN_P SCHEMA name_list
+ {
+ $$ = cat_str(2,mm_strdup("in schema"),$3);
+}
+| FOR ROLE role_list
+ {
+ $$ = cat_str(2,mm_strdup("for role"),$3);
+}
+| FOR USER role_list
+ {
+ $$ = cat_str(2,mm_strdup("for user"),$3);
+}
+;
+
+
+ DefACLAction:
+ GRANT privileges ON defacl_privilege_target TO grantee_list opt_grant_grant_option
+ {
+ $$ = cat_str(7,mm_strdup("grant"),$2,mm_strdup("on"),$4,mm_strdup("to"),$6,$7);
+}
+| REVOKE privileges ON defacl_privilege_target FROM grantee_list opt_drop_behavior
+ {
+ $$ = cat_str(7,mm_strdup("revoke"),$2,mm_strdup("on"),$4,mm_strdup("from"),$6,$7);
+}
+| REVOKE GRANT OPTION FOR privileges ON defacl_privilege_target FROM grantee_list opt_drop_behavior
+ {
+ $$ = cat_str(7,mm_strdup("revoke grant option for"),$5,mm_strdup("on"),$7,mm_strdup("from"),$9,$10);
+}
+;
+
+
+ defacl_privilege_target:
+ TABLES
+ {
+ $$ = mm_strdup("tables");
+}
+| FUNCTIONS
+ {
+ $$ = mm_strdup("functions");
+}
+| ROUTINES
+ {
+ $$ = mm_strdup("routines");
+}
+| SEQUENCES
+ {
+ $$ = mm_strdup("sequences");
+}
+| TYPES_P
+ {
+ $$ = mm_strdup("types");
+}
+| SCHEMAS
+ {
+ $$ = mm_strdup("schemas");
+}
+;
+
+
+ IndexStmt:
+ CREATE opt_unique INDEX opt_concurrently opt_index_name ON relation_expr access_method_clause '(' index_params ')' opt_include opt_reloptions OptTableSpace where_clause
+ {
+ $$ = cat_str(15,mm_strdup("create"),$2,mm_strdup("index"),$4,$5,mm_strdup("on"),$7,$8,mm_strdup("("),$10,mm_strdup(")"),$12,$13,$14,$15);
+}
+| CREATE opt_unique INDEX opt_concurrently IF_P NOT EXISTS name ON relation_expr access_method_clause '(' index_params ')' opt_include opt_reloptions OptTableSpace where_clause
+ {
+ $$ = cat_str(16,mm_strdup("create"),$2,mm_strdup("index"),$4,mm_strdup("if not exists"),$8,mm_strdup("on"),$10,$11,mm_strdup("("),$13,mm_strdup(")"),$15,$16,$17,$18);
+}
+;
+
+
+ opt_unique:
+ UNIQUE
+ {
+ $$ = mm_strdup("unique");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_concurrently:
+ CONCURRENTLY
+ {
+ $$ = mm_strdup("concurrently");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_index_name:
+ name
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ access_method_clause:
+ USING name
+ {
+ $$ = cat_str(2,mm_strdup("using"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ index_params:
+ index_elem
+ {
+ $$ = $1;
+}
+| index_params ',' index_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ index_elem_options:
+ opt_collate opt_class opt_asc_desc opt_nulls_order
+ {
+ $$ = cat_str(4,$1,$2,$3,$4);
+}
+| opt_collate any_name reloptions opt_asc_desc opt_nulls_order
+ {
+ $$ = cat_str(5,$1,$2,$3,$4,$5);
+}
+;
+
+
+ index_elem:
+ ColId index_elem_options
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| func_expr_windowless index_elem_options
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| '(' a_expr ')' index_elem_options
+ {
+ $$ = cat_str(4,mm_strdup("("),$2,mm_strdup(")"),$4);
+}
+;
+
+
+ opt_include:
+ INCLUDE '(' index_including_params ')'
+ {
+ $$ = cat_str(3,mm_strdup("include ("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ index_including_params:
+ index_elem
+ {
+ $$ = $1;
+}
+| index_including_params ',' index_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ opt_collate:
+ COLLATE any_name
+ {
+ $$ = cat_str(2,mm_strdup("collate"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_class:
+ any_name
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_asc_desc:
+ ASC
+ {
+ $$ = mm_strdup("asc");
+}
+| DESC
+ {
+ $$ = mm_strdup("desc");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_nulls_order:
+ NULLS_LA FIRST_P
+ {
+ $$ = mm_strdup("nulls first");
+}
+| NULLS_LA LAST_P
+ {
+ $$ = mm_strdup("nulls last");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ CreateFunctionStmt:
+ CREATE opt_or_replace FUNCTION func_name func_args_with_defaults RETURNS func_return opt_createfunc_opt_list opt_routine_body
+ {
+ $$ = cat_str(9,mm_strdup("create"),$2,mm_strdup("function"),$4,$5,mm_strdup("returns"),$7,$8,$9);
+}
+| CREATE opt_or_replace FUNCTION func_name func_args_with_defaults RETURNS TABLE '(' table_func_column_list ')' opt_createfunc_opt_list opt_routine_body
+ {
+ $$ = cat_str(10,mm_strdup("create"),$2,mm_strdup("function"),$4,$5,mm_strdup("returns table ("),$9,mm_strdup(")"),$11,$12);
+}
+| CREATE opt_or_replace FUNCTION func_name func_args_with_defaults opt_createfunc_opt_list opt_routine_body
+ {
+ $$ = cat_str(7,mm_strdup("create"),$2,mm_strdup("function"),$4,$5,$6,$7);
+}
+| CREATE opt_or_replace PROCEDURE func_name func_args_with_defaults opt_createfunc_opt_list opt_routine_body
+ {
+ $$ = cat_str(7,mm_strdup("create"),$2,mm_strdup("procedure"),$4,$5,$6,$7);
+}
+;
+
+
+ opt_or_replace:
+ OR REPLACE
+ {
+ $$ = mm_strdup("or replace");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ func_args:
+ '(' func_args_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+| '(' ')'
+ {
+ $$ = mm_strdup("( )");
+}
+;
+
+
+ func_args_list:
+ func_arg
+ {
+ $$ = $1;
+}
+| func_args_list ',' func_arg
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ function_with_argtypes_list:
+ function_with_argtypes
+ {
+ $$ = $1;
+}
+| function_with_argtypes_list ',' function_with_argtypes
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ function_with_argtypes:
+ func_name func_args
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| type_func_name_keyword
+ {
+ $$ = $1;
+}
+| ColId
+ {
+ $$ = $1;
+}
+| ColId indirection
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ func_args_with_defaults:
+ '(' func_args_with_defaults_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+| '(' ')'
+ {
+ $$ = mm_strdup("( )");
+}
+;
+
+
+ func_args_with_defaults_list:
+ func_arg_with_default
+ {
+ $$ = $1;
+}
+| func_args_with_defaults_list ',' func_arg_with_default
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ func_arg:
+ arg_class param_name func_type
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| param_name arg_class func_type
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| param_name func_type
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| arg_class func_type
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| func_type
+ {
+ $$ = $1;
+}
+;
+
+
+ arg_class:
+ IN_P
+ {
+ $$ = mm_strdup("in");
+}
+| OUT_P
+ {
+ $$ = mm_strdup("out");
+}
+| INOUT
+ {
+ $$ = mm_strdup("inout");
+}
+| IN_P OUT_P
+ {
+ $$ = mm_strdup("in out");
+}
+| VARIADIC
+ {
+ $$ = mm_strdup("variadic");
+}
+;
+
+
+ param_name:
+ type_function_name
+ {
+ $$ = $1;
+}
+;
+
+
+ func_return:
+ func_type
+ {
+ $$ = $1;
+}
+;
+
+
+ func_type:
+ Typename
+ {
+ $$ = $1;
+}
+| type_function_name attrs '%' TYPE_P
+ {
+ $$ = cat_str(3,$1,$2,mm_strdup("% type"));
+}
+| SETOF type_function_name attrs '%' TYPE_P
+ {
+ $$ = cat_str(4,mm_strdup("setof"),$2,$3,mm_strdup("% type"));
+}
+;
+
+
+ func_arg_with_default:
+ func_arg
+ {
+ $$ = $1;
+}
+| func_arg DEFAULT a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("default"),$3);
+}
+| func_arg '=' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("="),$3);
+}
+;
+
+
+ aggr_arg:
+ func_arg
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = $1;
+}
+;
+
+
+ aggr_args:
+ '(' '*' ')'
+ {
+ $$ = mm_strdup("( * )");
+}
+| '(' aggr_args_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+| '(' ORDER BY aggr_args_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("( order by"),$4,mm_strdup(")"));
+}
+| '(' aggr_args_list ORDER BY aggr_args_list ')'
+ {
+ $$ = cat_str(5,mm_strdup("("),$2,mm_strdup("order by"),$5,mm_strdup(")"));
+}
+;
+
+
+ aggr_args_list:
+ aggr_arg
+ {
+ $$ = $1;
+}
+| aggr_args_list ',' aggr_arg
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ aggregate_with_argtypes:
+ func_name aggr_args
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ aggregate_with_argtypes_list:
+ aggregate_with_argtypes
+ {
+ $$ = $1;
+}
+| aggregate_with_argtypes_list ',' aggregate_with_argtypes
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ opt_createfunc_opt_list:
+ createfunc_opt_list
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ createfunc_opt_list:
+ createfunc_opt_item
+ {
+ $$ = $1;
+}
+| createfunc_opt_list createfunc_opt_item
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ common_func_opt_item:
+ CALLED ON NULL_P INPUT_P
+ {
+ $$ = mm_strdup("called on null input");
+}
+| RETURNS NULL_P ON NULL_P INPUT_P
+ {
+ $$ = mm_strdup("returns null on null input");
+}
+| STRICT_P
+ {
+ $$ = mm_strdup("strict");
+}
+| IMMUTABLE
+ {
+ $$ = mm_strdup("immutable");
+}
+| STABLE
+ {
+ $$ = mm_strdup("stable");
+}
+| VOLATILE
+ {
+ $$ = mm_strdup("volatile");
+}
+| EXTERNAL SECURITY DEFINER
+ {
+ $$ = mm_strdup("external security definer");
+}
+| EXTERNAL SECURITY INVOKER
+ {
+ $$ = mm_strdup("external security invoker");
+}
+| SECURITY DEFINER
+ {
+ $$ = mm_strdup("security definer");
+}
+| SECURITY INVOKER
+ {
+ $$ = mm_strdup("security invoker");
+}
+| LEAKPROOF
+ {
+ $$ = mm_strdup("leakproof");
+}
+| NOT LEAKPROOF
+ {
+ $$ = mm_strdup("not leakproof");
+}
+| COST NumericOnly
+ {
+ $$ = cat_str(2,mm_strdup("cost"),$2);
+}
+| ROWS NumericOnly
+ {
+ $$ = cat_str(2,mm_strdup("rows"),$2);
+}
+| SUPPORT any_name
+ {
+ $$ = cat_str(2,mm_strdup("support"),$2);
+}
+| FunctionSetResetClause
+ {
+ $$ = $1;
+}
+| PARALLEL ColId
+ {
+ $$ = cat_str(2,mm_strdup("parallel"),$2);
+}
+;
+
+
+ createfunc_opt_item:
+ AS func_as
+ {
+ $$ = cat_str(2,mm_strdup("as"),$2);
+}
+| LANGUAGE NonReservedWord_or_Sconst
+ {
+ $$ = cat_str(2,mm_strdup("language"),$2);
+}
+| TRANSFORM transform_type_list
+ {
+ $$ = cat_str(2,mm_strdup("transform"),$2);
+}
+| WINDOW
+ {
+ $$ = mm_strdup("window");
+}
+| common_func_opt_item
+ {
+ $$ = $1;
+}
+;
+
+
+ func_as:
+ ecpg_sconst
+ {
+ $$ = $1;
+}
+| ecpg_sconst ',' ecpg_sconst
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ ReturnStmt:
+ RETURN a_expr
+ {
+ $$ = cat_str(2,mm_strdup("return"),$2);
+}
+;
+
+
+ opt_routine_body:
+ ReturnStmt
+ {
+ $$ = $1;
+}
+| BEGIN_P ATOMIC routine_body_stmt_list END_P
+ {
+ $$ = cat_str(3,mm_strdup("begin atomic"),$3,mm_strdup("end"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ routine_body_stmt_list:
+ routine_body_stmt_list routine_body_stmt ';'
+ {
+ $$ = cat_str(3,$1,$2,mm_strdup(";"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ routine_body_stmt:
+ stmt
+ {
+ $$ = $1;
+}
+| ReturnStmt
+ {
+ $$ = $1;
+}
+;
+
+
+ transform_type_list:
+ FOR TYPE_P Typename
+ {
+ $$ = cat_str(2,mm_strdup("for type"),$3);
+}
+| transform_type_list ',' FOR TYPE_P Typename
+ {
+ $$ = cat_str(3,$1,mm_strdup(", for type"),$5);
+}
+;
+
+
+ opt_definition:
+ WITH definition
+ {
+ $$ = cat_str(2,mm_strdup("with"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ table_func_column:
+ param_name func_type
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ table_func_column_list:
+ table_func_column
+ {
+ $$ = $1;
+}
+| table_func_column_list ',' table_func_column
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ AlterFunctionStmt:
+ ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
+ {
+ $$ = cat_str(4,mm_strdup("alter function"),$3,$4,$5);
+}
+| ALTER PROCEDURE function_with_argtypes alterfunc_opt_list opt_restrict
+ {
+ $$ = cat_str(4,mm_strdup("alter procedure"),$3,$4,$5);
+}
+| ALTER ROUTINE function_with_argtypes alterfunc_opt_list opt_restrict
+ {
+ $$ = cat_str(4,mm_strdup("alter routine"),$3,$4,$5);
+}
+;
+
+
+ alterfunc_opt_list:
+ common_func_opt_item
+ {
+ $$ = $1;
+}
+| alterfunc_opt_list common_func_opt_item
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ opt_restrict:
+ RESTRICT
+ {
+ $$ = mm_strdup("restrict");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ RemoveFuncStmt:
+ DROP FUNCTION function_with_argtypes_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop function"),$3,$4);
+}
+| DROP FUNCTION IF_P EXISTS function_with_argtypes_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop function if exists"),$5,$6);
+}
+| DROP PROCEDURE function_with_argtypes_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop procedure"),$3,$4);
+}
+| DROP PROCEDURE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop procedure if exists"),$5,$6);
+}
+| DROP ROUTINE function_with_argtypes_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop routine"),$3,$4);
+}
+| DROP ROUTINE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop routine if exists"),$5,$6);
+}
+;
+
+
+ RemoveAggrStmt:
+ DROP AGGREGATE aggregate_with_argtypes_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop aggregate"),$3,$4);
+}
+| DROP AGGREGATE IF_P EXISTS aggregate_with_argtypes_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop aggregate if exists"),$5,$6);
+}
+;
+
+
+ RemoveOperStmt:
+ DROP OPERATOR operator_with_argtypes_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop operator"),$3,$4);
+}
+| DROP OPERATOR IF_P EXISTS operator_with_argtypes_list opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop operator if exists"),$5,$6);
+}
+;
+
+
+ oper_argtypes:
+ '(' Typename ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+| '(' Typename ',' Typename ')'
+ {
+ $$ = cat_str(5,mm_strdup("("),$2,mm_strdup(","),$4,mm_strdup(")"));
+}
+| '(' NONE ',' Typename ')'
+ {
+ $$ = cat_str(3,mm_strdup("( none ,"),$4,mm_strdup(")"));
+}
+| '(' Typename ',' NONE ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(", none )"));
+}
+;
+
+
+ any_operator:
+ all_Op
+ {
+ $$ = $1;
+}
+| ColId '.' any_operator
+ {
+ $$ = cat_str(3,$1,mm_strdup("."),$3);
+}
+;
+
+
+ operator_with_argtypes_list:
+ operator_with_argtypes
+ {
+ $$ = $1;
+}
+| operator_with_argtypes_list ',' operator_with_argtypes
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ operator_with_argtypes:
+ any_operator oper_argtypes
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ DoStmt:
+ DO dostmt_opt_list
+ {
+ $$ = cat_str(2,mm_strdup("do"),$2);
+}
+;
+
+
+ dostmt_opt_list:
+ dostmt_opt_item
+ {
+ $$ = $1;
+}
+| dostmt_opt_list dostmt_opt_item
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ dostmt_opt_item:
+ ecpg_sconst
+ {
+ $$ = $1;
+}
+| LANGUAGE NonReservedWord_or_Sconst
+ {
+ $$ = cat_str(2,mm_strdup("language"),$2);
+}
+;
+
+
+ CreateCastStmt:
+ CREATE CAST '(' Typename AS Typename ')' WITH FUNCTION function_with_argtypes cast_context
+ {
+ $$ = cat_str(7,mm_strdup("create cast ("),$4,mm_strdup("as"),$6,mm_strdup(") with function"),$10,$11);
+}
+| CREATE CAST '(' Typename AS Typename ')' WITHOUT FUNCTION cast_context
+ {
+ $$ = cat_str(6,mm_strdup("create cast ("),$4,mm_strdup("as"),$6,mm_strdup(") without function"),$10);
+}
+| CREATE CAST '(' Typename AS Typename ')' WITH INOUT cast_context
+ {
+ $$ = cat_str(6,mm_strdup("create cast ("),$4,mm_strdup("as"),$6,mm_strdup(") with inout"),$10);
+}
+;
+
+
+ cast_context:
+ AS IMPLICIT_P
+ {
+ $$ = mm_strdup("as implicit");
+}
+| AS ASSIGNMENT
+ {
+ $$ = mm_strdup("as assignment");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ DropCastStmt:
+ DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior
+ {
+ $$ = cat_str(8,mm_strdup("drop cast"),$3,mm_strdup("("),$5,mm_strdup("as"),$7,mm_strdup(")"),$9);
+}
+;
+
+
+ opt_if_exists:
+ IF_P EXISTS
+ {
+ $$ = mm_strdup("if exists");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ CreateTransformStmt:
+ CREATE opt_or_replace TRANSFORM FOR Typename LANGUAGE name '(' transform_element_list ')'
+ {
+ $$ = cat_str(9,mm_strdup("create"),$2,mm_strdup("transform for"),$5,mm_strdup("language"),$7,mm_strdup("("),$9,mm_strdup(")"));
+}
+;
+
+
+ transform_element_list:
+ FROM SQL_P WITH FUNCTION function_with_argtypes ',' TO SQL_P WITH FUNCTION function_with_argtypes
+ {
+ $$ = cat_str(4,mm_strdup("from sql with function"),$5,mm_strdup(", to sql with function"),$11);
+}
+| TO SQL_P WITH FUNCTION function_with_argtypes ',' FROM SQL_P WITH FUNCTION function_with_argtypes
+ {
+ $$ = cat_str(4,mm_strdup("to sql with function"),$5,mm_strdup(", from sql with function"),$11);
+}
+| FROM SQL_P WITH FUNCTION function_with_argtypes
+ {
+ $$ = cat_str(2,mm_strdup("from sql with function"),$5);
+}
+| TO SQL_P WITH FUNCTION function_with_argtypes
+ {
+ $$ = cat_str(2,mm_strdup("to sql with function"),$5);
+}
+;
+
+
+ DropTransformStmt:
+ DROP TRANSFORM opt_if_exists FOR Typename LANGUAGE name opt_drop_behavior
+ {
+ $$ = cat_str(7,mm_strdup("drop transform"),$3,mm_strdup("for"),$5,mm_strdup("language"),$7,$8);
+}
+;
+
+
+ ReindexStmt:
+ REINDEX reindex_target_type opt_concurrently qualified_name
+ {
+ $$ = cat_str(4,mm_strdup("reindex"),$2,$3,$4);
+}
+| REINDEX reindex_target_multitable opt_concurrently name
+ {
+ $$ = cat_str(4,mm_strdup("reindex"),$2,$3,$4);
+}
+| REINDEX '(' utility_option_list ')' reindex_target_type opt_concurrently qualified_name
+ {
+ $$ = cat_str(6,mm_strdup("reindex ("),$3,mm_strdup(")"),$5,$6,$7);
+}
+| REINDEX '(' utility_option_list ')' reindex_target_multitable opt_concurrently name
+ {
+ $$ = cat_str(6,mm_strdup("reindex ("),$3,mm_strdup(")"),$5,$6,$7);
+}
+;
+
+
+ reindex_target_type:
+ INDEX
+ {
+ $$ = mm_strdup("index");
+}
+| TABLE
+ {
+ $$ = mm_strdup("table");
+}
+;
+
+
+ reindex_target_multitable:
+ SCHEMA
+ {
+ $$ = mm_strdup("schema");
+}
+| SYSTEM_P
+ {
+ $$ = mm_strdup("system");
+}
+| DATABASE
+ {
+ $$ = mm_strdup("database");
+}
+;
+
+
+ AlterTblSpcStmt:
+ ALTER TABLESPACE name SET reloptions
+ {
+ $$ = cat_str(4,mm_strdup("alter tablespace"),$3,mm_strdup("set"),$5);
+}
+| ALTER TABLESPACE name RESET reloptions
+ {
+ $$ = cat_str(4,mm_strdup("alter tablespace"),$3,mm_strdup("reset"),$5);
+}
+;
+
+
+ RenameStmt:
+ ALTER AGGREGATE aggregate_with_argtypes RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter aggregate"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER COLLATION any_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter collation"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER CONVERSION_P any_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter conversion"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER DATABASE name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter database"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER DOMAIN_P any_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter domain"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER DOMAIN_P any_name RENAME CONSTRAINT name TO name
+ {
+ $$ = cat_str(6,mm_strdup("alter domain"),$3,mm_strdup("rename constraint"),$6,mm_strdup("to"),$8);
+}
+| ALTER FOREIGN DATA_P WRAPPER name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter foreign data wrapper"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER FUNCTION function_with_argtypes RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter function"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER GROUP_P RoleId RENAME TO RoleId
+ {
+ $$ = cat_str(4,mm_strdup("alter group"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER opt_procedural LANGUAGE name RENAME TO name
+ {
+ $$ = cat_str(6,mm_strdup("alter"),$2,mm_strdup("language"),$4,mm_strdup("rename to"),$7);
+}
+| ALTER OPERATOR CLASS any_name USING name RENAME TO name
+ {
+ $$ = cat_str(6,mm_strdup("alter operator class"),$4,mm_strdup("using"),$6,mm_strdup("rename to"),$9);
+}
+| ALTER OPERATOR FAMILY any_name USING name RENAME TO name
+ {
+ $$ = cat_str(6,mm_strdup("alter operator family"),$4,mm_strdup("using"),$6,mm_strdup("rename to"),$9);
+}
+| ALTER POLICY name ON qualified_name RENAME TO name
+ {
+ $$ = cat_str(6,mm_strdup("alter policy"),$3,mm_strdup("on"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER POLICY IF_P EXISTS name ON qualified_name RENAME TO name
+ {
+ $$ = cat_str(6,mm_strdup("alter policy if exists"),$5,mm_strdup("on"),$7,mm_strdup("rename to"),$10);
+}
+| ALTER PROCEDURE function_with_argtypes RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter procedure"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER PUBLICATION name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter publication"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER ROUTINE function_with_argtypes RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter routine"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER SCHEMA name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter schema"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER SERVER name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter server"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER SUBSCRIPTION name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter subscription"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER TABLE relation_expr RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter table"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER TABLE IF_P EXISTS relation_expr RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter table if exists"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER SEQUENCE qualified_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter sequence"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER SEQUENCE IF_P EXISTS qualified_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter sequence if exists"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER VIEW qualified_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter view"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER VIEW IF_P EXISTS qualified_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter view if exists"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER MATERIALIZED VIEW qualified_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter materialized view"),$4,mm_strdup("rename to"),$7);
+}
+| ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter materialized view if exists"),$6,mm_strdup("rename to"),$9);
+}
+| ALTER INDEX qualified_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter index"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER INDEX IF_P EXISTS qualified_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter index if exists"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER FOREIGN TABLE relation_expr RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter foreign table"),$4,mm_strdup("rename to"),$7);
+}
+| ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter foreign table if exists"),$6,mm_strdup("rename to"),$9);
+}
+| ALTER TABLE relation_expr RENAME opt_column name TO name
+ {
+ $$ = cat_str(7,mm_strdup("alter table"),$3,mm_strdup("rename"),$5,$6,mm_strdup("to"),$8);
+}
+| ALTER TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
+ {
+ $$ = cat_str(7,mm_strdup("alter table if exists"),$5,mm_strdup("rename"),$7,$8,mm_strdup("to"),$10);
+}
+| ALTER VIEW qualified_name RENAME opt_column name TO name
+ {
+ $$ = cat_str(7,mm_strdup("alter view"),$3,mm_strdup("rename"),$5,$6,mm_strdup("to"),$8);
+}
+| ALTER VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
+ {
+ $$ = cat_str(7,mm_strdup("alter view if exists"),$5,mm_strdup("rename"),$7,$8,mm_strdup("to"),$10);
+}
+| ALTER MATERIALIZED VIEW qualified_name RENAME opt_column name TO name
+ {
+ $$ = cat_str(7,mm_strdup("alter materialized view"),$4,mm_strdup("rename"),$6,$7,mm_strdup("to"),$9);
+}
+| ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
+ {
+ $$ = cat_str(7,mm_strdup("alter materialized view if exists"),$6,mm_strdup("rename"),$8,$9,mm_strdup("to"),$11);
+}
+| ALTER TABLE relation_expr RENAME CONSTRAINT name TO name
+ {
+ $$ = cat_str(6,mm_strdup("alter table"),$3,mm_strdup("rename constraint"),$6,mm_strdup("to"),$8);
+}
+| ALTER TABLE IF_P EXISTS relation_expr RENAME CONSTRAINT name TO name
+ {
+ $$ = cat_str(6,mm_strdup("alter table if exists"),$5,mm_strdup("rename constraint"),$8,mm_strdup("to"),$10);
+}
+| ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name
+ {
+ $$ = cat_str(7,mm_strdup("alter foreign table"),$4,mm_strdup("rename"),$6,$7,mm_strdup("to"),$9);
+}
+| ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
+ {
+ $$ = cat_str(7,mm_strdup("alter foreign table if exists"),$6,mm_strdup("rename"),$8,$9,mm_strdup("to"),$11);
+}
+| ALTER RULE name ON qualified_name RENAME TO name
+ {
+ $$ = cat_str(6,mm_strdup("alter rule"),$3,mm_strdup("on"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER TRIGGER name ON qualified_name RENAME TO name
+ {
+ $$ = cat_str(6,mm_strdup("alter trigger"),$3,mm_strdup("on"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER EVENT TRIGGER name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter event trigger"),$4,mm_strdup("rename to"),$7);
+}
+| ALTER ROLE RoleId RENAME TO RoleId
+ {
+ $$ = cat_str(4,mm_strdup("alter role"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER USER RoleId RENAME TO RoleId
+ {
+ $$ = cat_str(4,mm_strdup("alter user"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER TABLESPACE name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter tablespace"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER STATISTICS any_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter statistics"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter text search parser"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter text search dictionary"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter text search template"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter text search configuration"),$5,mm_strdup("rename to"),$8);
+}
+| ALTER TYPE_P any_name RENAME TO name
+ {
+ $$ = cat_str(4,mm_strdup("alter type"),$3,mm_strdup("rename to"),$6);
+}
+| ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name opt_drop_behavior
+ {
+ $$ = cat_str(7,mm_strdup("alter type"),$3,mm_strdup("rename attribute"),$6,mm_strdup("to"),$8,$9);
+}
+;
+
+
+ opt_column:
+ COLUMN
+ {
+ $$ = mm_strdup("column");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_set_data:
+ SET DATA_P
+ {
+ $$ = mm_strdup("set data");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ AlterObjectDependsStmt:
+ ALTER FUNCTION function_with_argtypes opt_no DEPENDS ON EXTENSION name
+ {
+ $$ = cat_str(5,mm_strdup("alter function"),$3,$4,mm_strdup("depends on extension"),$8);
+}
+| ALTER PROCEDURE function_with_argtypes opt_no DEPENDS ON EXTENSION name
+ {
+ $$ = cat_str(5,mm_strdup("alter procedure"),$3,$4,mm_strdup("depends on extension"),$8);
+}
+| ALTER ROUTINE function_with_argtypes opt_no DEPENDS ON EXTENSION name
+ {
+ $$ = cat_str(5,mm_strdup("alter routine"),$3,$4,mm_strdup("depends on extension"),$8);
+}
+| ALTER TRIGGER name ON qualified_name opt_no DEPENDS ON EXTENSION name
+ {
+ $$ = cat_str(7,mm_strdup("alter trigger"),$3,mm_strdup("on"),$5,$6,mm_strdup("depends on extension"),$10);
+}
+| ALTER MATERIALIZED VIEW qualified_name opt_no DEPENDS ON EXTENSION name
+ {
+ $$ = cat_str(5,mm_strdup("alter materialized view"),$4,$5,mm_strdup("depends on extension"),$9);
+}
+| ALTER INDEX qualified_name opt_no DEPENDS ON EXTENSION name
+ {
+ $$ = cat_str(5,mm_strdup("alter index"),$3,$4,mm_strdup("depends on extension"),$8);
+}
+;
+
+
+ opt_no:
+ NO
+ {
+ $$ = mm_strdup("no");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ AlterObjectSchemaStmt:
+ ALTER AGGREGATE aggregate_with_argtypes SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter aggregate"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER COLLATION any_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter collation"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER CONVERSION_P any_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter conversion"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER DOMAIN_P any_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter domain"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER EXTENSION name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter extension"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER FUNCTION function_with_argtypes SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter function"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER OPERATOR operator_with_argtypes SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter operator"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER OPERATOR CLASS any_name USING name SET SCHEMA name
+ {
+ $$ = cat_str(6,mm_strdup("alter operator class"),$4,mm_strdup("using"),$6,mm_strdup("set schema"),$9);
+}
+| ALTER OPERATOR FAMILY any_name USING name SET SCHEMA name
+ {
+ $$ = cat_str(6,mm_strdup("alter operator family"),$4,mm_strdup("using"),$6,mm_strdup("set schema"),$9);
+}
+| ALTER PROCEDURE function_with_argtypes SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter procedure"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER ROUTINE function_with_argtypes SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter routine"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER TABLE relation_expr SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter table"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER TABLE IF_P EXISTS relation_expr SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter table if exists"),$5,mm_strdup("set schema"),$8);
+}
+| ALTER STATISTICS any_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter statistics"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter text search parser"),$5,mm_strdup("set schema"),$8);
+}
+| ALTER TEXT_P SEARCH DICTIONARY any_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter text search dictionary"),$5,mm_strdup("set schema"),$8);
+}
+| ALTER TEXT_P SEARCH TEMPLATE any_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter text search template"),$5,mm_strdup("set schema"),$8);
+}
+| ALTER TEXT_P SEARCH CONFIGURATION any_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter text search configuration"),$5,mm_strdup("set schema"),$8);
+}
+| ALTER SEQUENCE qualified_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter sequence"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER SEQUENCE IF_P EXISTS qualified_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter sequence if exists"),$5,mm_strdup("set schema"),$8);
+}
+| ALTER VIEW qualified_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter view"),$3,mm_strdup("set schema"),$6);
+}
+| ALTER VIEW IF_P EXISTS qualified_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter view if exists"),$5,mm_strdup("set schema"),$8);
+}
+| ALTER MATERIALIZED VIEW qualified_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter materialized view"),$4,mm_strdup("set schema"),$7);
+}
+| ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter materialized view if exists"),$6,mm_strdup("set schema"),$9);
+}
+| ALTER FOREIGN TABLE relation_expr SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter foreign table"),$4,mm_strdup("set schema"),$7);
+}
+| ALTER FOREIGN TABLE IF_P EXISTS relation_expr SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter foreign table if exists"),$6,mm_strdup("set schema"),$9);
+}
+| ALTER TYPE_P any_name SET SCHEMA name
+ {
+ $$ = cat_str(4,mm_strdup("alter type"),$3,mm_strdup("set schema"),$6);
+}
+;
+
+
+ AlterOperatorStmt:
+ ALTER OPERATOR operator_with_argtypes SET '(' operator_def_list ')'
+ {
+ $$ = cat_str(5,mm_strdup("alter operator"),$3,mm_strdup("set ("),$6,mm_strdup(")"));
+}
+;
+
+
+ operator_def_list:
+ operator_def_elem
+ {
+ $$ = $1;
+}
+| operator_def_list ',' operator_def_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ operator_def_elem:
+ ColLabel '=' NONE
+ {
+ $$ = cat_str(2,$1,mm_strdup("= none"));
+}
+| ColLabel '=' operator_def_arg
+ {
+ $$ = cat_str(3,$1,mm_strdup("="),$3);
+}
+;
+
+
+ operator_def_arg:
+ func_type
+ {
+ $$ = $1;
+}
+| reserved_keyword
+ {
+ $$ = $1;
+}
+| qual_all_Op
+ {
+ $$ = $1;
+}
+| NumericOnly
+ {
+ $$ = $1;
+}
+| ecpg_sconst
+ {
+ $$ = $1;
+}
+;
+
+
+ AlterTypeStmt:
+ ALTER TYPE_P any_name SET '(' operator_def_list ')'
+ {
+ $$ = cat_str(5,mm_strdup("alter type"),$3,mm_strdup("set ("),$6,mm_strdup(")"));
+}
+;
+
+
+ AlterOwnerStmt:
+ ALTER AGGREGATE aggregate_with_argtypes OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter aggregate"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER COLLATION any_name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter collation"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER CONVERSION_P any_name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter conversion"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER DATABASE name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter database"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER DOMAIN_P any_name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter domain"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER FUNCTION function_with_argtypes OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter function"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER opt_procedural LANGUAGE name OWNER TO RoleSpec
+ {
+ $$ = cat_str(6,mm_strdup("alter"),$2,mm_strdup("language"),$4,mm_strdup("owner to"),$7);
+}
+| ALTER LARGE_P OBJECT_P NumericOnly OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter large object"),$4,mm_strdup("owner to"),$7);
+}
+| ALTER OPERATOR operator_with_argtypes OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter operator"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER OPERATOR CLASS any_name USING name OWNER TO RoleSpec
+ {
+ $$ = cat_str(6,mm_strdup("alter operator class"),$4,mm_strdup("using"),$6,mm_strdup("owner to"),$9);
+}
+| ALTER OPERATOR FAMILY any_name USING name OWNER TO RoleSpec
+ {
+ $$ = cat_str(6,mm_strdup("alter operator family"),$4,mm_strdup("using"),$6,mm_strdup("owner to"),$9);
+}
+| ALTER PROCEDURE function_with_argtypes OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter procedure"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER ROUTINE function_with_argtypes OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter routine"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER SCHEMA name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter schema"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER TYPE_P any_name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter type"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER TABLESPACE name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter tablespace"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER STATISTICS any_name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter statistics"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter text search dictionary"),$5,mm_strdup("owner to"),$8);
+}
+| ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter text search configuration"),$5,mm_strdup("owner to"),$8);
+}
+| ALTER FOREIGN DATA_P WRAPPER name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter foreign data wrapper"),$5,mm_strdup("owner to"),$8);
+}
+| ALTER SERVER name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter server"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER EVENT TRIGGER name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter event trigger"),$4,mm_strdup("owner to"),$7);
+}
+| ALTER PUBLICATION name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter publication"),$3,mm_strdup("owner to"),$6);
+}
+| ALTER SUBSCRIPTION name OWNER TO RoleSpec
+ {
+ $$ = cat_str(4,mm_strdup("alter subscription"),$3,mm_strdup("owner to"),$6);
+}
+;
+
+
+ CreatePublicationStmt:
+ CREATE PUBLICATION name opt_publication_for_tables opt_definition
+ {
+ $$ = cat_str(4,mm_strdup("create publication"),$3,$4,$5);
+}
+;
+
+
+ opt_publication_for_tables:
+ publication_for_tables
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ publication_for_tables:
+ FOR TABLE relation_expr_list
+ {
+ $$ = cat_str(2,mm_strdup("for table"),$3);
+}
+| FOR ALL TABLES
+ {
+ $$ = mm_strdup("for all tables");
+}
+;
+
+
+ AlterPublicationStmt:
+ ALTER PUBLICATION name SET definition
+ {
+ $$ = cat_str(4,mm_strdup("alter publication"),$3,mm_strdup("set"),$5);
+}
+| ALTER PUBLICATION name ADD_P TABLE relation_expr_list
+ {
+ $$ = cat_str(4,mm_strdup("alter publication"),$3,mm_strdup("add table"),$6);
+}
+| ALTER PUBLICATION name SET TABLE relation_expr_list
+ {
+ $$ = cat_str(4,mm_strdup("alter publication"),$3,mm_strdup("set table"),$6);
+}
+| ALTER PUBLICATION name DROP TABLE relation_expr_list
+ {
+ $$ = cat_str(4,mm_strdup("alter publication"),$3,mm_strdup("drop table"),$6);
+}
+;
+
+
+ CreateSubscriptionStmt:
+ CREATE SUBSCRIPTION name CONNECTION ecpg_sconst PUBLICATION name_list opt_definition
+ {
+ $$ = cat_str(7,mm_strdup("create subscription"),$3,mm_strdup("connection"),$5,mm_strdup("publication"),$7,$8);
+}
+;
+
+
+ AlterSubscriptionStmt:
+ ALTER SUBSCRIPTION name SET definition
+ {
+ $$ = cat_str(4,mm_strdup("alter subscription"),$3,mm_strdup("set"),$5);
+}
+| ALTER SUBSCRIPTION name CONNECTION ecpg_sconst
+ {
+ $$ = cat_str(4,mm_strdup("alter subscription"),$3,mm_strdup("connection"),$5);
+}
+| ALTER SUBSCRIPTION name REFRESH PUBLICATION opt_definition
+ {
+ $$ = cat_str(4,mm_strdup("alter subscription"),$3,mm_strdup("refresh publication"),$6);
+}
+| ALTER SUBSCRIPTION name ADD_P PUBLICATION name_list opt_definition
+ {
+ $$ = cat_str(5,mm_strdup("alter subscription"),$3,mm_strdup("add publication"),$6,$7);
+}
+| ALTER SUBSCRIPTION name DROP PUBLICATION name_list opt_definition
+ {
+ $$ = cat_str(5,mm_strdup("alter subscription"),$3,mm_strdup("drop publication"),$6,$7);
+}
+| ALTER SUBSCRIPTION name SET PUBLICATION name_list opt_definition
+ {
+ $$ = cat_str(5,mm_strdup("alter subscription"),$3,mm_strdup("set publication"),$6,$7);
+}
+| ALTER SUBSCRIPTION name ENABLE_P
+ {
+ $$ = cat_str(3,mm_strdup("alter subscription"),$3,mm_strdup("enable"));
+}
+| ALTER SUBSCRIPTION name DISABLE_P
+ {
+ $$ = cat_str(3,mm_strdup("alter subscription"),$3,mm_strdup("disable"));
+}
+;
+
+
+ DropSubscriptionStmt:
+ DROP SUBSCRIPTION name opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop subscription"),$3,$4);
+}
+| DROP SUBSCRIPTION IF_P EXISTS name opt_drop_behavior
+ {
+ $$ = cat_str(3,mm_strdup("drop subscription if exists"),$5,$6);
+}
+;
+
+
+ RuleStmt:
+ CREATE opt_or_replace RULE name AS ON event TO qualified_name where_clause DO opt_instead RuleActionList
+ {
+ $$ = cat_str(12,mm_strdup("create"),$2,mm_strdup("rule"),$4,mm_strdup("as on"),$7,mm_strdup("to"),$9,$10,mm_strdup("do"),$12,$13);
+}
+;
+
+
+ RuleActionList:
+ NOTHING
+ {
+ $$ = mm_strdup("nothing");
+}
+| RuleActionStmt
+ {
+ $$ = $1;
+}
+| '(' RuleActionMulti ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+;
+
+
+ RuleActionMulti:
+ RuleActionMulti ';' RuleActionStmtOrEmpty
+ {
+ $$ = cat_str(3,$1,mm_strdup(";"),$3);
+}
+| RuleActionStmtOrEmpty
+ {
+ $$ = $1;
+}
+;
+
+
+ RuleActionStmt:
+ SelectStmt
+ {
+ $$ = $1;
+}
+| InsertStmt
+ {
+ $$ = $1;
+}
+| UpdateStmt
+ {
+ $$ = $1;
+}
+| DeleteStmt
+ {
+ $$ = $1;
+}
+| NotifyStmt
+ {
+ $$ = $1;
+}
+;
+
+
+ RuleActionStmtOrEmpty:
+ RuleActionStmt
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ event:
+ SELECT
+ {
+ $$ = mm_strdup("select");
+}
+| UPDATE
+ {
+ $$ = mm_strdup("update");
+}
+| DELETE_P
+ {
+ $$ = mm_strdup("delete");
+}
+| INSERT
+ {
+ $$ = mm_strdup("insert");
+}
+;
+
+
+ opt_instead:
+ INSTEAD
+ {
+ $$ = mm_strdup("instead");
+}
+| ALSO
+ {
+ $$ = mm_strdup("also");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ NotifyStmt:
+ NOTIFY ColId notify_payload
+ {
+ $$ = cat_str(3,mm_strdup("notify"),$2,$3);
+}
+;
+
+
+ notify_payload:
+ ',' ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup(","),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ ListenStmt:
+ LISTEN ColId
+ {
+ $$ = cat_str(2,mm_strdup("listen"),$2);
+}
+;
+
+
+ UnlistenStmt:
+ UNLISTEN ColId
+ {
+ $$ = cat_str(2,mm_strdup("unlisten"),$2);
+}
+| UNLISTEN '*'
+ {
+ $$ = mm_strdup("unlisten *");
+}
+;
+
+
+ TransactionStmt:
+ ABORT_P opt_transaction opt_transaction_chain
+ {
+ $$ = cat_str(3,mm_strdup("abort"),$2,$3);
+}
+| START TRANSACTION transaction_mode_list_or_empty
+ {
+ $$ = cat_str(2,mm_strdup("start transaction"),$3);
+}
+| COMMIT opt_transaction opt_transaction_chain
+ {
+ $$ = cat_str(3,mm_strdup("commit"),$2,$3);
+}
+| ROLLBACK opt_transaction opt_transaction_chain
+ {
+ $$ = cat_str(3,mm_strdup("rollback"),$2,$3);
+}
+| SAVEPOINT ColId
+ {
+ $$ = cat_str(2,mm_strdup("savepoint"),$2);
+}
+| RELEASE SAVEPOINT ColId
+ {
+ $$ = cat_str(2,mm_strdup("release savepoint"),$3);
+}
+| RELEASE ColId
+ {
+ $$ = cat_str(2,mm_strdup("release"),$2);
+}
+| ROLLBACK opt_transaction TO SAVEPOINT ColId
+ {
+ $$ = cat_str(4,mm_strdup("rollback"),$2,mm_strdup("to savepoint"),$5);
+}
+| ROLLBACK opt_transaction TO ColId
+ {
+ $$ = cat_str(4,mm_strdup("rollback"),$2,mm_strdup("to"),$4);
+}
+| PREPARE TRANSACTION ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("prepare transaction"),$3);
+}
+| COMMIT PREPARED ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("commit prepared"),$3);
+}
+| ROLLBACK PREPARED ecpg_sconst
+ {
+ $$ = cat_str(2,mm_strdup("rollback prepared"),$3);
+}
+;
+
+
+ TransactionStmtLegacy:
+ BEGIN_P opt_transaction transaction_mode_list_or_empty
+ {
+ $$ = cat_str(3,mm_strdup("begin"),$2,$3);
+}
+| END_P opt_transaction opt_transaction_chain
+ {
+ $$ = cat_str(3,mm_strdup("end"),$2,$3);
+}
+;
+
+
+ opt_transaction:
+ WORK
+ {
+ $$ = mm_strdup("work");
+}
+| TRANSACTION
+ {
+ $$ = mm_strdup("transaction");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ transaction_mode_item:
+ ISOLATION LEVEL iso_level
+ {
+ $$ = cat_str(2,mm_strdup("isolation level"),$3);
+}
+| READ ONLY
+ {
+ $$ = mm_strdup("read only");
+}
+| READ WRITE
+ {
+ $$ = mm_strdup("read write");
+}
+| DEFERRABLE
+ {
+ $$ = mm_strdup("deferrable");
+}
+| NOT DEFERRABLE
+ {
+ $$ = mm_strdup("not deferrable");
+}
+;
+
+
+ transaction_mode_list:
+ transaction_mode_item
+ {
+ $$ = $1;
+}
+| transaction_mode_list ',' transaction_mode_item
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+| transaction_mode_list transaction_mode_item
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ transaction_mode_list_or_empty:
+ transaction_mode_list
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_transaction_chain:
+ AND CHAIN
+ {
+ $$ = mm_strdup("and chain");
+}
+| AND NO CHAIN
+ {
+ $$ = mm_strdup("and no chain");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ ViewStmt:
+ CREATE OptTemp VIEW qualified_name opt_column_list opt_reloptions AS SelectStmt opt_check_option
+ {
+ $$ = cat_str(9,mm_strdup("create"),$2,mm_strdup("view"),$4,$5,$6,mm_strdup("as"),$8,$9);
+}
+| CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list opt_reloptions AS SelectStmt opt_check_option
+ {
+ $$ = cat_str(9,mm_strdup("create or replace"),$4,mm_strdup("view"),$6,$7,$8,mm_strdup("as"),$10,$11);
+}
+| CREATE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions AS SelectStmt opt_check_option
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = cat_str(11,mm_strdup("create"),$2,mm_strdup("recursive view"),$5,mm_strdup("("),$7,mm_strdup(")"),$9,mm_strdup("as"),$11,$12);
+}
+| CREATE OR REPLACE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions AS SelectStmt opt_check_option
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = cat_str(11,mm_strdup("create or replace"),$4,mm_strdup("recursive view"),$7,mm_strdup("("),$9,mm_strdup(")"),$11,mm_strdup("as"),$13,$14);
+}
+;
+
+
+ opt_check_option:
+ WITH CHECK OPTION
+ {
+ $$ = mm_strdup("with check option");
+}
+| WITH CASCADED CHECK OPTION
+ {
+ $$ = mm_strdup("with cascaded check option");
+}
+| WITH LOCAL CHECK OPTION
+ {
+ $$ = mm_strdup("with local check option");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ LoadStmt:
+ LOAD file_name
+ {
+ $$ = cat_str(2,mm_strdup("load"),$2);
+}
+;
+
+
+ CreatedbStmt:
+ CREATE DATABASE name opt_with createdb_opt_list
+ {
+ $$ = cat_str(4,mm_strdup("create database"),$3,$4,$5);
+}
+;
+
+
+ createdb_opt_list:
+ createdb_opt_items
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ createdb_opt_items:
+ createdb_opt_item
+ {
+ $$ = $1;
+}
+| createdb_opt_items createdb_opt_item
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ createdb_opt_item:
+ createdb_opt_name opt_equal SignedIconst
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| createdb_opt_name opt_equal opt_boolean_or_string
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| createdb_opt_name opt_equal DEFAULT
+ {
+ $$ = cat_str(3,$1,$2,mm_strdup("default"));
+}
+;
+
+
+ createdb_opt_name:
+ ecpg_ident
+ {
+ $$ = $1;
+}
+| CONNECTION LIMIT
+ {
+ $$ = mm_strdup("connection limit");
+}
+| ENCODING
+ {
+ $$ = mm_strdup("encoding");
+}
+| LOCATION
+ {
+ $$ = mm_strdup("location");
+}
+| OWNER
+ {
+ $$ = mm_strdup("owner");
+}
+| TABLESPACE
+ {
+ $$ = mm_strdup("tablespace");
+}
+| TEMPLATE
+ {
+ $$ = mm_strdup("template");
+}
+;
+
+
+ opt_equal:
+ '='
+ {
+ $$ = mm_strdup("=");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ AlterDatabaseStmt:
+ ALTER DATABASE name WITH createdb_opt_list
+ {
+ $$ = cat_str(4,mm_strdup("alter database"),$3,mm_strdup("with"),$5);
+}
+| ALTER DATABASE name createdb_opt_list
+ {
+ $$ = cat_str(3,mm_strdup("alter database"),$3,$4);
+}
+| ALTER DATABASE name SET TABLESPACE name
+ {
+ $$ = cat_str(4,mm_strdup("alter database"),$3,mm_strdup("set tablespace"),$6);
+}
+;
+
+
+ AlterDatabaseSetStmt:
+ ALTER DATABASE name SetResetClause
+ {
+ $$ = cat_str(3,mm_strdup("alter database"),$3,$4);
+}
+;
+
+
+ DropdbStmt:
+ DROP DATABASE name
+ {
+ $$ = cat_str(2,mm_strdup("drop database"),$3);
+}
+| DROP DATABASE IF_P EXISTS name
+ {
+ $$ = cat_str(2,mm_strdup("drop database if exists"),$5);
+}
+| DROP DATABASE name opt_with '(' drop_option_list ')'
+ {
+ $$ = cat_str(6,mm_strdup("drop database"),$3,$4,mm_strdup("("),$6,mm_strdup(")"));
+}
+| DROP DATABASE IF_P EXISTS name opt_with '(' drop_option_list ')'
+ {
+ $$ = cat_str(6,mm_strdup("drop database if exists"),$5,$6,mm_strdup("("),$8,mm_strdup(")"));
+}
+;
+
+
+ drop_option_list:
+ drop_option
+ {
+ $$ = $1;
+}
+| drop_option_list ',' drop_option
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ drop_option:
+ FORCE
+ {
+ $$ = mm_strdup("force");
+}
+;
+
+
+ AlterCollationStmt:
+ ALTER COLLATION any_name REFRESH VERSION_P
+ {
+ $$ = cat_str(3,mm_strdup("alter collation"),$3,mm_strdup("refresh version"));
+}
+;
+
+
+ AlterSystemStmt:
+ ALTER SYSTEM_P SET generic_set
+ {
+ $$ = cat_str(2,mm_strdup("alter system set"),$4);
+}
+| ALTER SYSTEM_P RESET generic_reset
+ {
+ $$ = cat_str(2,mm_strdup("alter system reset"),$4);
+}
+;
+
+
+ CreateDomainStmt:
+ CREATE DOMAIN_P any_name opt_as Typename ColQualList
+ {
+ $$ = cat_str(5,mm_strdup("create domain"),$3,$4,$5,$6);
+}
+;
+
+
+ AlterDomainStmt:
+ ALTER DOMAIN_P any_name alter_column_default
+ {
+ $$ = cat_str(3,mm_strdup("alter domain"),$3,$4);
+}
+| ALTER DOMAIN_P any_name DROP NOT NULL_P
+ {
+ $$ = cat_str(3,mm_strdup("alter domain"),$3,mm_strdup("drop not null"));
+}
+| ALTER DOMAIN_P any_name SET NOT NULL_P
+ {
+ $$ = cat_str(3,mm_strdup("alter domain"),$3,mm_strdup("set not null"));
+}
+| ALTER DOMAIN_P any_name ADD_P TableConstraint
+ {
+ $$ = cat_str(4,mm_strdup("alter domain"),$3,mm_strdup("add"),$5);
+}
+| ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
+ {
+ $$ = cat_str(5,mm_strdup("alter domain"),$3,mm_strdup("drop constraint"),$6,$7);
+}
+| ALTER DOMAIN_P any_name DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
+ {
+ $$ = cat_str(5,mm_strdup("alter domain"),$3,mm_strdup("drop constraint if exists"),$8,$9);
+}
+| ALTER DOMAIN_P any_name VALIDATE CONSTRAINT name
+ {
+ $$ = cat_str(4,mm_strdup("alter domain"),$3,mm_strdup("validate constraint"),$6);
+}
+;
+
+
+ opt_as:
+ AS
+ {
+ $$ = mm_strdup("as");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ AlterTSDictionaryStmt:
+ ALTER TEXT_P SEARCH DICTIONARY any_name definition
+ {
+ $$ = cat_str(3,mm_strdup("alter text search dictionary"),$5,$6);
+}
+;
+
+
+ AlterTSConfigurationStmt:
+ ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list any_with any_name_list
+ {
+ $$ = cat_str(6,mm_strdup("alter text search configuration"),$5,mm_strdup("add mapping for"),$9,$10,$11);
+}
+| ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list any_with any_name_list
+ {
+ $$ = cat_str(6,mm_strdup("alter text search configuration"),$5,mm_strdup("alter mapping for"),$9,$10,$11);
+}
+| ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name any_with any_name
+ {
+ $$ = cat_str(6,mm_strdup("alter text search configuration"),$5,mm_strdup("alter mapping replace"),$9,$10,$11);
+}
+| ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name any_with any_name
+ {
+ $$ = cat_str(8,mm_strdup("alter text search configuration"),$5,mm_strdup("alter mapping for"),$9,mm_strdup("replace"),$11,$12,$13);
+}
+| ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list
+ {
+ $$ = cat_str(4,mm_strdup("alter text search configuration"),$5,mm_strdup("drop mapping for"),$9);
+}
+| ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list
+ {
+ $$ = cat_str(4,mm_strdup("alter text search configuration"),$5,mm_strdup("drop mapping if exists for"),$11);
+}
+;
+
+
+ any_with:
+ WITH
+ {
+ $$ = mm_strdup("with");
+}
+| WITH_LA
+ {
+ $$ = mm_strdup("with");
+}
+;
+
+
+ CreateConversionStmt:
+ CREATE opt_default CONVERSION_P any_name FOR ecpg_sconst TO ecpg_sconst FROM any_name
+ {
+ $$ = cat_str(10,mm_strdup("create"),$2,mm_strdup("conversion"),$4,mm_strdup("for"),$6,mm_strdup("to"),$8,mm_strdup("from"),$10);
+}
+;
+
+
+ ClusterStmt:
+ CLUSTER opt_verbose qualified_name cluster_index_specification
+ {
+ $$ = cat_str(4,mm_strdup("cluster"),$2,$3,$4);
+}
+| CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification
+ {
+ $$ = cat_str(5,mm_strdup("cluster ("),$3,mm_strdup(")"),$5,$6);
+}
+| CLUSTER opt_verbose
+ {
+ $$ = cat_str(2,mm_strdup("cluster"),$2);
+}
+| CLUSTER opt_verbose name ON qualified_name
+ {
+ $$ = cat_str(5,mm_strdup("cluster"),$2,$3,mm_strdup("on"),$5);
+}
+;
+
+
+ cluster_index_specification:
+ USING name
+ {
+ $$ = cat_str(2,mm_strdup("using"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ VacuumStmt:
+ VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relation_list
+ {
+ $$ = cat_str(6,mm_strdup("vacuum"),$2,$3,$4,$5,$6);
+}
+| VACUUM '(' utility_option_list ')' opt_vacuum_relation_list
+ {
+ $$ = cat_str(4,mm_strdup("vacuum ("),$3,mm_strdup(")"),$5);
+}
+;
+
+
+ AnalyzeStmt:
+ analyze_keyword opt_verbose opt_vacuum_relation_list
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| analyze_keyword '(' utility_option_list ')' opt_vacuum_relation_list
+ {
+ $$ = cat_str(5,$1,mm_strdup("("),$3,mm_strdup(")"),$5);
+}
+;
+
+
+ utility_option_list:
+ utility_option_elem
+ {
+ $$ = $1;
+}
+| utility_option_list ',' utility_option_elem
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ analyze_keyword:
+ ANALYZE
+ {
+ $$ = mm_strdup("analyze");
+}
+| ANALYSE
+ {
+ $$ = mm_strdup("analyse");
+}
+;
+
+
+ utility_option_elem:
+ utility_option_name utility_option_arg
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ utility_option_name:
+ NonReservedWord
+ {
+ $$ = $1;
+}
+| analyze_keyword
+ {
+ $$ = $1;
+}
+;
+
+
+ utility_option_arg:
+ opt_boolean_or_string
+ {
+ $$ = $1;
+}
+| NumericOnly
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_analyze:
+ analyze_keyword
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_verbose:
+ VERBOSE
+ {
+ $$ = mm_strdup("verbose");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_full:
+ FULL
+ {
+ $$ = mm_strdup("full");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_freeze:
+ FREEZE
+ {
+ $$ = mm_strdup("freeze");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_name_list:
+ '(' name_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ vacuum_relation:
+ qualified_name opt_name_list
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ vacuum_relation_list:
+ vacuum_relation
+ {
+ $$ = $1;
+}
+| vacuum_relation_list ',' vacuum_relation
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ opt_vacuum_relation_list:
+ vacuum_relation_list
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ ExplainStmt:
+ EXPLAIN ExplainableStmt
+ {
+ $$ = cat_str(2,mm_strdup("explain"),$2);
+}
+| EXPLAIN analyze_keyword opt_verbose ExplainableStmt
+ {
+ $$ = cat_str(4,mm_strdup("explain"),$2,$3,$4);
+}
+| EXPLAIN VERBOSE ExplainableStmt
+ {
+ $$ = cat_str(2,mm_strdup("explain verbose"),$3);
+}
+| EXPLAIN '(' utility_option_list ')' ExplainableStmt
+ {
+ $$ = cat_str(4,mm_strdup("explain ("),$3,mm_strdup(")"),$5);
+}
+;
+
+
+ ExplainableStmt:
+ SelectStmt
+ {
+ $$ = $1;
+}
+| InsertStmt
+ {
+ $$ = $1;
+}
+| UpdateStmt
+ {
+ $$ = $1;
+}
+| DeleteStmt
+ {
+ $$ = $1;
+}
+| DeclareCursorStmt
+ {
+ $$ = $1;
+}
+| CreateAsStmt
+ {
+ $$ = $1;
+}
+| CreateMatViewStmt
+ {
+ $$ = $1;
+}
+| RefreshMatViewStmt
+ {
+ $$ = $1;
+}
+| ExecuteStmt
+ {
+ $$ = $1.name;
+ }
+;
+
+
+ PrepareStmt:
+PREPARE prepared_name prep_type_clause AS PreparableStmt
+ {
+ $$.name = $2;
+ $$.type = $3;
+ $$.stmt = $5;
+ }
+ | PREPARE prepared_name FROM execstring
+ {
+ $$.name = $2;
+ $$.type = NULL;
+ $$.stmt = $4;
+ }
+;
+
+
+ prep_type_clause:
+ '(' type_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ PreparableStmt:
+ SelectStmt
+ {
+ $$ = $1;
+}
+| InsertStmt
+ {
+ $$ = $1;
+}
+| UpdateStmt
+ {
+ $$ = $1;
+}
+| DeleteStmt
+ {
+ $$ = $1;
+}
+;
+
+
+ ExecuteStmt:
+EXECUTE prepared_name execute_param_clause execute_rest
+ {
+ $$.name = $2;
+ $$.type = $3;
+ }
+| CREATE OptTemp TABLE create_as_target AS EXECUTE prepared_name execute_param_clause opt_with_data execute_rest
+ {
+ $$.name = cat_str(8,mm_strdup("create"),$2,mm_strdup("table"),$4,mm_strdup("as execute"),$7,$8,$9);
+ }
+| CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS EXECUTE prepared_name execute_param_clause opt_with_data execute_rest
+ {
+ $$.name = cat_str(8,mm_strdup("create"),$2,mm_strdup("table if not exists"),$7,mm_strdup("as execute"),$10,$11,$12);
+ }
+;
+
+
+ execute_param_clause:
+ '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ InsertStmt:
+ opt_with_clause INSERT INTO insert_target insert_rest opt_on_conflict returning_clause
+ {
+ $$ = cat_str(6,$1,mm_strdup("insert into"),$4,$5,$6,$7);
+}
+;
+
+
+ insert_target:
+ qualified_name
+ {
+ $$ = $1;
+}
+| qualified_name AS ColId
+ {
+ $$ = cat_str(3,$1,mm_strdup("as"),$3);
+}
+;
+
+
+ insert_rest:
+ SelectStmt
+ {
+ $$ = $1;
+}
+| OVERRIDING override_kind VALUE_P SelectStmt
+ {
+ $$ = cat_str(4,mm_strdup("overriding"),$2,mm_strdup("value"),$4);
+}
+| '(' insert_column_list ')' SelectStmt
+ {
+ $$ = cat_str(4,mm_strdup("("),$2,mm_strdup(")"),$4);
+}
+| '(' insert_column_list ')' OVERRIDING override_kind VALUE_P SelectStmt
+ {
+ $$ = cat_str(6,mm_strdup("("),$2,mm_strdup(") overriding"),$5,mm_strdup("value"),$7);
+}
+| DEFAULT VALUES
+ {
+ $$ = mm_strdup("default values");
+}
+;
+
+
+ override_kind:
+ USER
+ {
+ $$ = mm_strdup("user");
+}
+| SYSTEM_P
+ {
+ $$ = mm_strdup("system");
+}
+;
+
+
+ insert_column_list:
+ insert_column_item
+ {
+ $$ = $1;
+}
+| insert_column_list ',' insert_column_item
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ insert_column_item:
+ ColId opt_indirection
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ opt_on_conflict:
+ ON CONFLICT opt_conf_expr DO UPDATE SET set_clause_list where_clause
+ {
+ $$ = cat_str(5,mm_strdup("on conflict"),$3,mm_strdup("do update set"),$7,$8);
+}
+| ON CONFLICT opt_conf_expr DO NOTHING
+ {
+ $$ = cat_str(3,mm_strdup("on conflict"),$3,mm_strdup("do nothing"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_conf_expr:
+ '(' index_params ')' where_clause
+ {
+ $$ = cat_str(4,mm_strdup("("),$2,mm_strdup(")"),$4);
+}
+| ON CONSTRAINT name
+ {
+ $$ = cat_str(2,mm_strdup("on constraint"),$3);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ returning_clause:
+RETURNING target_list opt_ecpg_into
+ {
+ $$ = cat_str(2,mm_strdup("returning"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ DeleteStmt:
+ opt_with_clause DELETE_P FROM relation_expr_opt_alias using_clause where_or_current_clause returning_clause
+ {
+ $$ = cat_str(6,$1,mm_strdup("delete from"),$4,$5,$6,$7);
+}
+;
+
+
+ using_clause:
+ USING from_list
+ {
+ $$ = cat_str(2,mm_strdup("using"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ LockStmt:
+ LOCK_P opt_table relation_expr_list opt_lock opt_nowait
+ {
+ $$ = cat_str(5,mm_strdup("lock"),$2,$3,$4,$5);
+}
+;
+
+
+ opt_lock:
+ IN_P lock_type MODE
+ {
+ $$ = cat_str(3,mm_strdup("in"),$2,mm_strdup("mode"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ lock_type:
+ ACCESS SHARE
+ {
+ $$ = mm_strdup("access share");
+}
+| ROW SHARE
+ {
+ $$ = mm_strdup("row share");
+}
+| ROW EXCLUSIVE
+ {
+ $$ = mm_strdup("row exclusive");
+}
+| SHARE UPDATE EXCLUSIVE
+ {
+ $$ = mm_strdup("share update exclusive");
+}
+| SHARE
+ {
+ $$ = mm_strdup("share");
+}
+| SHARE ROW EXCLUSIVE
+ {
+ $$ = mm_strdup("share row exclusive");
+}
+| EXCLUSIVE
+ {
+ $$ = mm_strdup("exclusive");
+}
+| ACCESS EXCLUSIVE
+ {
+ $$ = mm_strdup("access exclusive");
+}
+;
+
+
+ opt_nowait:
+ NOWAIT
+ {
+ $$ = mm_strdup("nowait");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_nowait_or_skip:
+ NOWAIT
+ {
+ $$ = mm_strdup("nowait");
+}
+| SKIP LOCKED
+ {
+ $$ = mm_strdup("skip locked");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ UpdateStmt:
+ opt_with_clause UPDATE relation_expr_opt_alias SET set_clause_list from_clause where_or_current_clause returning_clause
+ {
+ $$ = cat_str(8,$1,mm_strdup("update"),$3,mm_strdup("set"),$5,$6,$7,$8);
+}
+;
+
+
+ set_clause_list:
+ set_clause
+ {
+ $$ = $1;
+}
+| set_clause_list ',' set_clause
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ set_clause:
+ set_target '=' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("="),$3);
+}
+| '(' set_target_list ')' '=' a_expr
+ {
+ $$ = cat_str(4,mm_strdup("("),$2,mm_strdup(") ="),$5);
+}
+;
+
+
+ set_target:
+ ColId opt_indirection
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ set_target_list:
+ set_target
+ {
+ $$ = $1;
+}
+| set_target_list ',' set_target
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ DeclareCursorStmt:
+ DECLARE cursor_name cursor_options CURSOR opt_hold FOR SelectStmt
+ {
+ struct cursor *ptr, *this;
+ char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : mm_strdup($2);
+ char *comment, *c1, *c2;
+ int (* strcmp_fn)(const char *, const char *) = (($2[0] == ':' || $2[0] == '"') ? strcmp : pg_strcasecmp);
+
+ if (INFORMIX_MODE && pg_strcasecmp($2, "database") == 0)
+ mmfatal(PARSE_ERROR, "\"database\" cannot be used as cursor name in INFORMIX mode");
+
+ for (ptr = cur; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp_fn($2, ptr->name) == 0)
+ {
+ if ($2[0] == ':')
+ mmerror(PARSE_ERROR, ET_ERROR, "using variable \"%s\" in different declare statements is not supported", $2+1);
+ else
+ mmerror(PARSE_ERROR, ET_ERROR, "cursor \"%s\" is already defined", $2);
+ }
+ }
+
+ this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+
+ this->next = cur;
+ this->name = $2;
+ this->function = (current_function ? mm_strdup(current_function) : NULL);
+ this->connection = connection ? mm_strdup(connection) : NULL;
+ this->opened = false;
+ this->command = cat_str(7, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for"), $7);
+ this->argsinsert = argsinsert;
+ this->argsinsert_oos = NULL;
+ this->argsresult = argsresult;
+ this->argsresult_oos = NULL;
+ argsinsert = argsresult = NULL;
+ cur = this;
+
+ c1 = mm_strdup(this->command);
+ if ((c2 = strstr(c1, "*/")) != NULL)
+ {
+ /* We put this text into a comment, so we better remove [*][/]. */
+ c2[0] = '.';
+ c2[1] = '.';
+ }
+ comment = cat_str(3, mm_strdup("/*"), c1, mm_strdup("*/"));
+
+ $$ = cat2_str(adjust_outofscope_cursor_vars(this), comment);
+ }
+;
+
+
+ cursor_name:
+ name
+ {
+ $$ = $1;
+}
+ | char_civar
+ {
+ char *curname = mm_alloc(strlen($1) + 2);
+ sprintf(curname, ":%s", $1);
+ free($1);
+ $1 = curname;
+ $$ = $1;
+ }
+;
+
+
+ cursor_options:
+
+ {
+ $$=EMPTY; }
+| cursor_options NO SCROLL
+ {
+ $$ = cat_str(2,$1,mm_strdup("no scroll"));
+}
+| cursor_options SCROLL
+ {
+ $$ = cat_str(2,$1,mm_strdup("scroll"));
+}
+| cursor_options BINARY
+ {
+ $$ = cat_str(2,$1,mm_strdup("binary"));
+}
+| cursor_options ASENSITIVE
+ {
+ $$ = cat_str(2,$1,mm_strdup("asensitive"));
+}
+| cursor_options INSENSITIVE
+ {
+ $$ = cat_str(2,$1,mm_strdup("insensitive"));
+}
+;
+
+
+ opt_hold:
+
+ {
+ if (compat == ECPG_COMPAT_INFORMIX_SE && autocommit)
+ $$ = mm_strdup("with hold");
+ else
+ $$ = EMPTY;
+ }
+| WITH HOLD
+ {
+ $$ = mm_strdup("with hold");
+}
+| WITHOUT HOLD
+ {
+ $$ = mm_strdup("without hold");
+}
+;
+
+
+ SelectStmt:
+ select_no_parens %prec UMINUS
+ {
+ $$ = $1;
+}
+| select_with_parens %prec UMINUS
+ {
+ $$ = $1;
+}
+;
+
+
+ select_with_parens:
+ '(' select_no_parens ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+| '(' select_with_parens ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+;
+
+
+ select_no_parens:
+ simple_select
+ {
+ $$ = $1;
+}
+| select_clause sort_clause
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| select_clause opt_sort_clause for_locking_clause opt_select_limit
+ {
+ $$ = cat_str(4,$1,$2,$3,$4);
+}
+| select_clause opt_sort_clause select_limit opt_for_locking_clause
+ {
+ $$ = cat_str(4,$1,$2,$3,$4);
+}
+| with_clause select_clause
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| with_clause select_clause sort_clause
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| with_clause select_clause opt_sort_clause for_locking_clause opt_select_limit
+ {
+ $$ = cat_str(5,$1,$2,$3,$4,$5);
+}
+| with_clause select_clause opt_sort_clause select_limit opt_for_locking_clause
+ {
+ $$ = cat_str(5,$1,$2,$3,$4,$5);
+}
+;
+
+
+ select_clause:
+ simple_select
+ {
+ $$ = $1;
+}
+| select_with_parens
+ {
+ $$ = $1;
+}
+;
+
+
+ simple_select:
+ SELECT opt_all_clause opt_target_list into_clause from_clause where_clause group_clause having_clause window_clause
+ {
+ $$ = cat_str(9,mm_strdup("select"),$2,$3,$4,$5,$6,$7,$8,$9);
+}
+| SELECT distinct_clause target_list into_clause from_clause where_clause group_clause having_clause window_clause
+ {
+ $$ = cat_str(9,mm_strdup("select"),$2,$3,$4,$5,$6,$7,$8,$9);
+}
+| values_clause
+ {
+ $$ = $1;
+}
+| TABLE relation_expr
+ {
+ $$ = cat_str(2,mm_strdup("table"),$2);
+}
+| select_clause UNION set_quantifier select_clause
+ {
+ $$ = cat_str(4,$1,mm_strdup("union"),$3,$4);
+}
+| select_clause INTERSECT set_quantifier select_clause
+ {
+ $$ = cat_str(4,$1,mm_strdup("intersect"),$3,$4);
+}
+| select_clause EXCEPT set_quantifier select_clause
+ {
+ $$ = cat_str(4,$1,mm_strdup("except"),$3,$4);
+}
+;
+
+
+ with_clause:
+ WITH cte_list
+ {
+ $$ = cat_str(2,mm_strdup("with"),$2);
+}
+| WITH_LA cte_list
+ {
+ $$ = cat_str(2,mm_strdup("with"),$2);
+}
+| WITH RECURSIVE cte_list
+ {
+ $$ = cat_str(2,mm_strdup("with recursive"),$3);
+}
+;
+
+
+ cte_list:
+ common_table_expr
+ {
+ $$ = $1;
+}
+| cte_list ',' common_table_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ common_table_expr:
+ name opt_name_list AS opt_materialized '(' PreparableStmt ')' opt_search_clause opt_cycle_clause
+ {
+ $$ = cat_str(9,$1,$2,mm_strdup("as"),$4,mm_strdup("("),$6,mm_strdup(")"),$8,$9);
+}
+;
+
+
+ opt_materialized:
+ MATERIALIZED
+ {
+ $$ = mm_strdup("materialized");
+}
+| NOT MATERIALIZED
+ {
+ $$ = mm_strdup("not materialized");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_search_clause:
+ SEARCH DEPTH FIRST_P BY columnList SET ColId
+ {
+ $$ = cat_str(4,mm_strdup("search depth first by"),$5,mm_strdup("set"),$7);
+}
+| SEARCH BREADTH FIRST_P BY columnList SET ColId
+ {
+ $$ = cat_str(4,mm_strdup("search breadth first by"),$5,mm_strdup("set"),$7);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_cycle_clause:
+ CYCLE columnList SET ColId TO AexprConst DEFAULT AexprConst USING ColId
+ {
+ $$ = cat_str(10,mm_strdup("cycle"),$2,mm_strdup("set"),$4,mm_strdup("to"),$6,mm_strdup("default"),$8,mm_strdup("using"),$10);
+}
+| CYCLE columnList SET ColId USING ColId
+ {
+ $$ = cat_str(6,mm_strdup("cycle"),$2,mm_strdup("set"),$4,mm_strdup("using"),$6);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_with_clause:
+ with_clause
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ into_clause:
+ INTO OptTempTableName
+ {
+ FoundInto = 1;
+ $$= cat2_str(mm_strdup("into"), $2);
+ }
+ | ecpg_into { $$ = EMPTY; }
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptTempTableName:
+ TEMPORARY opt_table qualified_name
+ {
+ $$ = cat_str(3,mm_strdup("temporary"),$2,$3);
+}
+| TEMP opt_table qualified_name
+ {
+ $$ = cat_str(3,mm_strdup("temp"),$2,$3);
+}
+| LOCAL TEMPORARY opt_table qualified_name
+ {
+ $$ = cat_str(3,mm_strdup("local temporary"),$3,$4);
+}
+| LOCAL TEMP opt_table qualified_name
+ {
+ $$ = cat_str(3,mm_strdup("local temp"),$3,$4);
+}
+| GLOBAL TEMPORARY opt_table qualified_name
+ {
+ $$ = cat_str(3,mm_strdup("global temporary"),$3,$4);
+}
+| GLOBAL TEMP opt_table qualified_name
+ {
+ $$ = cat_str(3,mm_strdup("global temp"),$3,$4);
+}
+| UNLOGGED opt_table qualified_name
+ {
+ $$ = cat_str(3,mm_strdup("unlogged"),$2,$3);
+}
+| TABLE qualified_name
+ {
+ $$ = cat_str(2,mm_strdup("table"),$2);
+}
+| qualified_name
+ {
+ $$ = $1;
+}
+;
+
+
+ opt_table:
+ TABLE
+ {
+ $$ = mm_strdup("table");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ set_quantifier:
+ ALL
+ {
+ $$ = mm_strdup("all");
+}
+| DISTINCT
+ {
+ $$ = mm_strdup("distinct");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ distinct_clause:
+ DISTINCT
+ {
+ $$ = mm_strdup("distinct");
+}
+| DISTINCT ON '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("distinct on ("),$4,mm_strdup(")"));
+}
+;
+
+
+ opt_all_clause:
+ ALL
+ {
+ $$ = mm_strdup("all");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_sort_clause:
+ sort_clause
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ sort_clause:
+ ORDER BY sortby_list
+ {
+ $$ = cat_str(2,mm_strdup("order by"),$3);
+}
+;
+
+
+ sortby_list:
+ sortby
+ {
+ $$ = $1;
+}
+| sortby_list ',' sortby
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ sortby:
+ a_expr USING qual_all_Op opt_nulls_order
+ {
+ $$ = cat_str(4,$1,mm_strdup("using"),$3,$4);
+}
+| a_expr opt_asc_desc opt_nulls_order
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+;
+
+
+ select_limit:
+ limit_clause offset_clause
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| offset_clause limit_clause
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| limit_clause
+ {
+ $$ = $1;
+}
+| offset_clause
+ {
+ $$ = $1;
+}
+;
+
+
+ opt_select_limit:
+ select_limit
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ limit_clause:
+ LIMIT select_limit_value
+ {
+ $$ = cat_str(2,mm_strdup("limit"),$2);
+}
+| LIMIT select_limit_value ',' select_offset_value
+ {
+ mmerror(PARSE_ERROR, ET_WARNING, "no longer supported LIMIT #,# syntax passed to server");
+ $$ = cat_str(4, mm_strdup("limit"), $2, mm_strdup(","), $4);
+ }
+| FETCH first_or_next select_fetch_first_value row_or_rows ONLY
+ {
+ $$ = cat_str(5,mm_strdup("fetch"),$2,$3,$4,mm_strdup("only"));
+}
+| FETCH first_or_next select_fetch_first_value row_or_rows WITH TIES
+ {
+ $$ = cat_str(5,mm_strdup("fetch"),$2,$3,$4,mm_strdup("with ties"));
+}
+| FETCH first_or_next row_or_rows ONLY
+ {
+ $$ = cat_str(4,mm_strdup("fetch"),$2,$3,mm_strdup("only"));
+}
+| FETCH first_or_next row_or_rows WITH TIES
+ {
+ $$ = cat_str(4,mm_strdup("fetch"),$2,$3,mm_strdup("with ties"));
+}
+;
+
+
+ offset_clause:
+ OFFSET select_offset_value
+ {
+ $$ = cat_str(2,mm_strdup("offset"),$2);
+}
+| OFFSET select_fetch_first_value row_or_rows
+ {
+ $$ = cat_str(3,mm_strdup("offset"),$2,$3);
+}
+;
+
+
+ select_limit_value:
+ a_expr
+ {
+ $$ = $1;
+}
+| ALL
+ {
+ $$ = mm_strdup("all");
+}
+;
+
+
+ select_offset_value:
+ a_expr
+ {
+ $$ = $1;
+}
+;
+
+
+ select_fetch_first_value:
+ c_expr
+ {
+ $$ = $1;
+}
+| '+' I_or_F_const
+ {
+ $$ = cat_str(2,mm_strdup("+"),$2);
+}
+| '-' I_or_F_const
+ {
+ $$ = cat_str(2,mm_strdup("-"),$2);
+}
+;
+
+
+ I_or_F_const:
+ Iconst
+ {
+ $$ = $1;
+}
+| ecpg_fconst
+ {
+ $$ = $1;
+}
+;
+
+
+ row_or_rows:
+ ROW
+ {
+ $$ = mm_strdup("row");
+}
+| ROWS
+ {
+ $$ = mm_strdup("rows");
+}
+;
+
+
+ first_or_next:
+ FIRST_P
+ {
+ $$ = mm_strdup("first");
+}
+| NEXT
+ {
+ $$ = mm_strdup("next");
+}
+;
+
+
+ group_clause:
+ GROUP_P BY set_quantifier group_by_list
+ {
+ $$ = cat_str(3,mm_strdup("group by"),$3,$4);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ group_by_list:
+ group_by_item
+ {
+ $$ = $1;
+}
+| group_by_list ',' group_by_item
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ group_by_item:
+ a_expr
+ {
+ $$ = $1;
+}
+| empty_grouping_set
+ {
+ $$ = $1;
+}
+| cube_clause
+ {
+ $$ = $1;
+}
+| rollup_clause
+ {
+ $$ = $1;
+}
+| grouping_sets_clause
+ {
+ $$ = $1;
+}
+;
+
+
+ empty_grouping_set:
+ '(' ')'
+ {
+ $$ = mm_strdup("( )");
+}
+;
+
+
+ rollup_clause:
+ ROLLUP '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("rollup ("),$3,mm_strdup(")"));
+}
+;
+
+
+ cube_clause:
+ CUBE '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("cube ("),$3,mm_strdup(")"));
+}
+;
+
+
+ grouping_sets_clause:
+ GROUPING SETS '(' group_by_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("grouping sets ("),$4,mm_strdup(")"));
+}
+;
+
+
+ having_clause:
+ HAVING a_expr
+ {
+ $$ = cat_str(2,mm_strdup("having"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ for_locking_clause:
+ for_locking_items
+ {
+ $$ = $1;
+}
+| FOR READ ONLY
+ {
+ $$ = mm_strdup("for read only");
+}
+;
+
+
+ opt_for_locking_clause:
+ for_locking_clause
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ for_locking_items:
+ for_locking_item
+ {
+ $$ = $1;
+}
+| for_locking_items for_locking_item
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ for_locking_item:
+ for_locking_strength locked_rels_list opt_nowait_or_skip
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+;
+
+
+ for_locking_strength:
+ FOR UPDATE
+ {
+ $$ = mm_strdup("for update");
+}
+| FOR NO KEY UPDATE
+ {
+ $$ = mm_strdup("for no key update");
+}
+| FOR SHARE
+ {
+ $$ = mm_strdup("for share");
+}
+| FOR KEY SHARE
+ {
+ $$ = mm_strdup("for key share");
+}
+;
+
+
+ locked_rels_list:
+ OF qualified_name_list
+ {
+ $$ = cat_str(2,mm_strdup("of"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ values_clause:
+ VALUES '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("values ("),$3,mm_strdup(")"));
+}
+| values_clause ',' '(' expr_list ')'
+ {
+ $$ = cat_str(4,$1,mm_strdup(", ("),$4,mm_strdup(")"));
+}
+;
+
+
+ from_clause:
+ FROM from_list
+ {
+ $$ = cat_str(2,mm_strdup("from"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ from_list:
+ table_ref
+ {
+ $$ = $1;
+}
+| from_list ',' table_ref
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ table_ref:
+ relation_expr opt_alias_clause
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| relation_expr opt_alias_clause tablesample_clause
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| func_table func_alias_clause
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| LATERAL_P func_table func_alias_clause
+ {
+ $$ = cat_str(3,mm_strdup("lateral"),$2,$3);
+}
+| xmltable opt_alias_clause
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| LATERAL_P xmltable opt_alias_clause
+ {
+ $$ = cat_str(3,mm_strdup("lateral"),$2,$3);
+}
+| select_with_parens opt_alias_clause
+ {
+ if ($2 == NULL)
+ mmerror(PARSE_ERROR, ET_ERROR, "subquery in FROM must have an alias");
+
+ $$ = cat_str(2,$1,$2);
+}
+| LATERAL_P select_with_parens opt_alias_clause
+ {
+ if ($3 == NULL)
+ mmerror(PARSE_ERROR, ET_ERROR, "subquery in FROM must have an alias");
+
+ $$ = cat_str(3,mm_strdup("lateral"),$2,$3);
+}
+| joined_table
+ {
+ $$ = $1;
+}
+| '(' joined_table ')' alias_clause
+ {
+ $$ = cat_str(4,mm_strdup("("),$2,mm_strdup(")"),$4);
+}
+;
+
+
+ joined_table:
+ '(' joined_table ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+| table_ref CROSS JOIN table_ref
+ {
+ $$ = cat_str(3,$1,mm_strdup("cross join"),$4);
+}
+| table_ref join_type JOIN table_ref join_qual
+ {
+ $$ = cat_str(5,$1,$2,mm_strdup("join"),$4,$5);
+}
+| table_ref JOIN table_ref join_qual
+ {
+ $$ = cat_str(4,$1,mm_strdup("join"),$3,$4);
+}
+| table_ref NATURAL join_type JOIN table_ref
+ {
+ $$ = cat_str(5,$1,mm_strdup("natural"),$3,mm_strdup("join"),$5);
+}
+| table_ref NATURAL JOIN table_ref
+ {
+ $$ = cat_str(3,$1,mm_strdup("natural join"),$4);
+}
+;
+
+
+ alias_clause:
+ AS ColId '(' name_list ')'
+ {
+ $$ = cat_str(5,mm_strdup("as"),$2,mm_strdup("("),$4,mm_strdup(")"));
+}
+| AS ColId
+ {
+ $$ = cat_str(2,mm_strdup("as"),$2);
+}
+| ColId '(' name_list ')'
+ {
+ $$ = cat_str(4,$1,mm_strdup("("),$3,mm_strdup(")"));
+}
+| ColId
+ {
+ $$ = $1;
+}
+;
+
+
+ opt_alias_clause:
+ alias_clause
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_alias_clause_for_join_using:
+ AS ColId
+ {
+ $$ = cat_str(2,mm_strdup("as"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ func_alias_clause:
+ alias_clause
+ {
+ $$ = $1;
+}
+| AS '(' TableFuncElementList ')'
+ {
+ $$ = cat_str(3,mm_strdup("as ("),$3,mm_strdup(")"));
+}
+| AS ColId '(' TableFuncElementList ')'
+ {
+ $$ = cat_str(5,mm_strdup("as"),$2,mm_strdup("("),$4,mm_strdup(")"));
+}
+| ColId '(' TableFuncElementList ')'
+ {
+ $$ = cat_str(4,$1,mm_strdup("("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ join_type:
+ FULL opt_outer
+ {
+ $$ = cat_str(2,mm_strdup("full"),$2);
+}
+| LEFT opt_outer
+ {
+ $$ = cat_str(2,mm_strdup("left"),$2);
+}
+| RIGHT opt_outer
+ {
+ $$ = cat_str(2,mm_strdup("right"),$2);
+}
+| INNER_P
+ {
+ $$ = mm_strdup("inner");
+}
+;
+
+
+ opt_outer:
+ OUTER_P
+ {
+ $$ = mm_strdup("outer");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ join_qual:
+ USING '(' name_list ')' opt_alias_clause_for_join_using
+ {
+ $$ = cat_str(4,mm_strdup("using ("),$3,mm_strdup(")"),$5);
+}
+| ON a_expr
+ {
+ $$ = cat_str(2,mm_strdup("on"),$2);
+}
+;
+
+
+ relation_expr:
+ qualified_name
+ {
+ $$ = $1;
+}
+| qualified_name '*'
+ {
+ $$ = cat_str(2,$1,mm_strdup("*"));
+}
+| ONLY qualified_name
+ {
+ $$ = cat_str(2,mm_strdup("only"),$2);
+}
+| ONLY '(' qualified_name ')'
+ {
+ $$ = cat_str(3,mm_strdup("only ("),$3,mm_strdup(")"));
+}
+;
+
+
+ relation_expr_list:
+ relation_expr
+ {
+ $$ = $1;
+}
+| relation_expr_list ',' relation_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ relation_expr_opt_alias:
+ relation_expr %prec UMINUS
+ {
+ $$ = $1;
+}
+| relation_expr ColId
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| relation_expr AS ColId
+ {
+ $$ = cat_str(3,$1,mm_strdup("as"),$3);
+}
+;
+
+
+ tablesample_clause:
+ TABLESAMPLE func_name '(' expr_list ')' opt_repeatable_clause
+ {
+ $$ = cat_str(6,mm_strdup("tablesample"),$2,mm_strdup("("),$4,mm_strdup(")"),$6);
+}
+;
+
+
+ opt_repeatable_clause:
+ REPEATABLE '(' a_expr ')'
+ {
+ $$ = cat_str(3,mm_strdup("repeatable ("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ func_table:
+ func_expr_windowless opt_ordinality
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| ROWS FROM '(' rowsfrom_list ')' opt_ordinality
+ {
+ $$ = cat_str(4,mm_strdup("rows from ("),$4,mm_strdup(")"),$6);
+}
+;
+
+
+ rowsfrom_item:
+ func_expr_windowless opt_col_def_list
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ rowsfrom_list:
+ rowsfrom_item
+ {
+ $$ = $1;
+}
+| rowsfrom_list ',' rowsfrom_item
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ opt_col_def_list:
+ AS '(' TableFuncElementList ')'
+ {
+ $$ = cat_str(3,mm_strdup("as ("),$3,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_ordinality:
+ WITH_LA ORDINALITY
+ {
+ $$ = mm_strdup("with ordinality");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ where_clause:
+ WHERE a_expr
+ {
+ $$ = cat_str(2,mm_strdup("where"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ where_or_current_clause:
+ WHERE a_expr
+ {
+ $$ = cat_str(2,mm_strdup("where"),$2);
+}
+| WHERE CURRENT_P OF cursor_name
+ {
+ char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
+ $$ = cat_str(2,mm_strdup("where current of"), cursor_marker);
+ }
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ OptTableFuncElementList:
+ TableFuncElementList
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ TableFuncElementList:
+ TableFuncElement
+ {
+ $$ = $1;
+}
+| TableFuncElementList ',' TableFuncElement
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ TableFuncElement:
+ ColId Typename opt_collate_clause
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+;
+
+
+ xmltable:
+ XMLTABLE '(' c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
+ {
+ $$ = cat_str(6,mm_strdup("xmltable ("),$3,$4,mm_strdup("columns"),$6,mm_strdup(")"));
+}
+| XMLTABLE '(' XMLNAMESPACES '(' xml_namespace_list ')' ',' c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
+ {
+ $$ = cat_str(8,mm_strdup("xmltable ( xmlnamespaces ("),$5,mm_strdup(") ,"),$8,$9,mm_strdup("columns"),$11,mm_strdup(")"));
+}
+;
+
+
+ xmltable_column_list:
+ xmltable_column_el
+ {
+ $$ = $1;
+}
+| xmltable_column_list ',' xmltable_column_el
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ xmltable_column_el:
+ ColId Typename
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| ColId Typename xmltable_column_option_list
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| ColId FOR ORDINALITY
+ {
+ $$ = cat_str(2,$1,mm_strdup("for ordinality"));
+}
+;
+
+
+ xmltable_column_option_list:
+ xmltable_column_option_el
+ {
+ $$ = $1;
+}
+| xmltable_column_option_list xmltable_column_option_el
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ xmltable_column_option_el:
+ ecpg_ident b_expr
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| DEFAULT b_expr
+ {
+ $$ = cat_str(2,mm_strdup("default"),$2);
+}
+| NOT NULL_P
+ {
+ $$ = mm_strdup("not null");
+}
+| NULL_P
+ {
+ $$ = mm_strdup("null");
+}
+;
+
+
+ xml_namespace_list:
+ xml_namespace_el
+ {
+ $$ = $1;
+}
+| xml_namespace_list ',' xml_namespace_el
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ xml_namespace_el:
+ b_expr AS ColLabel
+ {
+ $$ = cat_str(3,$1,mm_strdup("as"),$3);
+}
+| DEFAULT b_expr
+ {
+ $$ = cat_str(2,mm_strdup("default"),$2);
+}
+;
+
+
+ Typename:
+ SimpleTypename opt_array_bounds
+ { $$ = cat2_str($1, $2.str); }
+| SETOF SimpleTypename opt_array_bounds
+ { $$ = cat_str(3, mm_strdup("setof"), $2, $3.str); }
+| SimpleTypename ARRAY '[' Iconst ']'
+ {
+ $$ = cat_str(4,$1,mm_strdup("array ["),$4,mm_strdup("]"));
+}
+| SETOF SimpleTypename ARRAY '[' Iconst ']'
+ {
+ $$ = cat_str(5,mm_strdup("setof"),$2,mm_strdup("array ["),$5,mm_strdup("]"));
+}
+| SimpleTypename ARRAY
+ {
+ $$ = cat_str(2,$1,mm_strdup("array"));
+}
+| SETOF SimpleTypename ARRAY
+ {
+ $$ = cat_str(3,mm_strdup("setof"),$2,mm_strdup("array"));
+}
+;
+
+
+ opt_array_bounds:
+ opt_array_bounds '[' ']'
+ {
+ $$.index1 = $1.index1;
+ $$.index2 = $1.index2;
+ if (strcmp($$.index1, "-1") == 0)
+ $$.index1 = mm_strdup("0");
+ else if (strcmp($1.index2, "-1") == 0)
+ $$.index2 = mm_strdup("0");
+ $$.str = cat_str(2, $1.str, mm_strdup("[]"));
+ }
+ | opt_array_bounds '[' Iresult ']'
+ {
+ $$.index1 = $1.index1;
+ $$.index2 = $1.index2;
+ if (strcmp($1.index1, "-1") == 0)
+ $$.index1 = mm_strdup($3);
+ else if (strcmp($1.index2, "-1") == 0)
+ $$.index2 = mm_strdup($3);
+ $$.str = cat_str(4, $1.str, mm_strdup("["), $3, mm_strdup("]"));
+ }
+|
+ {
+ $$.index1 = mm_strdup("-1");
+ $$.index2 = mm_strdup("-1");
+ $$.str= EMPTY;
+ }
+;
+
+
+ SimpleTypename:
+ GenericType
+ {
+ $$ = $1;
+}
+| Numeric
+ {
+ $$ = $1;
+}
+| Bit
+ {
+ $$ = $1;
+}
+| Character
+ {
+ $$ = $1;
+}
+| ConstDatetime
+ {
+ $$ = $1;
+}
+| ConstInterval opt_interval
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| ConstInterval '(' Iconst ')'
+ {
+ $$ = cat_str(4,$1,mm_strdup("("),$3,mm_strdup(")"));
+}
+;
+
+
+ ConstTypename:
+ Numeric
+ {
+ $$ = $1;
+}
+| ConstBit
+ {
+ $$ = $1;
+}
+| ConstCharacter
+ {
+ $$ = $1;
+}
+| ConstDatetime
+ {
+ $$ = $1;
+}
+;
+
+
+ GenericType:
+ type_function_name opt_type_modifiers
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| type_function_name attrs opt_type_modifiers
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+;
+
+
+ opt_type_modifiers:
+ '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ Numeric:
+ INT_P
+ {
+ $$ = mm_strdup("int");
+}
+| INTEGER
+ {
+ $$ = mm_strdup("integer");
+}
+| SMALLINT
+ {
+ $$ = mm_strdup("smallint");
+}
+| BIGINT
+ {
+ $$ = mm_strdup("bigint");
+}
+| REAL
+ {
+ $$ = mm_strdup("real");
+}
+| FLOAT_P opt_float
+ {
+ $$ = cat_str(2,mm_strdup("float"),$2);
+}
+| DOUBLE_P PRECISION
+ {
+ $$ = mm_strdup("double precision");
+}
+| DECIMAL_P opt_type_modifiers
+ {
+ $$ = cat_str(2,mm_strdup("decimal"),$2);
+}
+| DEC opt_type_modifiers
+ {
+ $$ = cat_str(2,mm_strdup("dec"),$2);
+}
+| NUMERIC opt_type_modifiers
+ {
+ $$ = cat_str(2,mm_strdup("numeric"),$2);
+}
+| BOOLEAN_P
+ {
+ $$ = mm_strdup("boolean");
+}
+;
+
+
+ opt_float:
+ '(' Iconst ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ Bit:
+ BitWithLength
+ {
+ $$ = $1;
+}
+| BitWithoutLength
+ {
+ $$ = $1;
+}
+;
+
+
+ ConstBit:
+ BitWithLength
+ {
+ $$ = $1;
+}
+| BitWithoutLength
+ {
+ $$ = $1;
+}
+;
+
+
+ BitWithLength:
+ BIT opt_varying '(' expr_list ')'
+ {
+ $$ = cat_str(5,mm_strdup("bit"),$2,mm_strdup("("),$4,mm_strdup(")"));
+}
+;
+
+
+ BitWithoutLength:
+ BIT opt_varying
+ {
+ $$ = cat_str(2,mm_strdup("bit"),$2);
+}
+;
+
+
+ Character:
+ CharacterWithLength
+ {
+ $$ = $1;
+}
+| CharacterWithoutLength
+ {
+ $$ = $1;
+}
+;
+
+
+ ConstCharacter:
+ CharacterWithLength
+ {
+ $$ = $1;
+}
+| CharacterWithoutLength
+ {
+ $$ = $1;
+}
+;
+
+
+ CharacterWithLength:
+ character '(' Iconst ')'
+ {
+ $$ = cat_str(4,$1,mm_strdup("("),$3,mm_strdup(")"));
+}
+;
+
+
+ CharacterWithoutLength:
+ character
+ {
+ $$ = $1;
+}
+;
+
+
+ character:
+ CHARACTER opt_varying
+ {
+ $$ = cat_str(2,mm_strdup("character"),$2);
+}
+| CHAR_P opt_varying
+ {
+ $$ = cat_str(2,mm_strdup("char"),$2);
+}
+| VARCHAR
+ {
+ $$ = mm_strdup("varchar");
+}
+| NATIONAL CHARACTER opt_varying
+ {
+ $$ = cat_str(2,mm_strdup("national character"),$3);
+}
+| NATIONAL CHAR_P opt_varying
+ {
+ $$ = cat_str(2,mm_strdup("national char"),$3);
+}
+| NCHAR opt_varying
+ {
+ $$ = cat_str(2,mm_strdup("nchar"),$2);
+}
+;
+
+
+ opt_varying:
+ VARYING
+ {
+ $$ = mm_strdup("varying");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ ConstDatetime:
+ TIMESTAMP '(' Iconst ')' opt_timezone
+ {
+ $$ = cat_str(4,mm_strdup("timestamp ("),$3,mm_strdup(")"),$5);
+}
+| TIMESTAMP opt_timezone
+ {
+ $$ = cat_str(2,mm_strdup("timestamp"),$2);
+}
+| TIME '(' Iconst ')' opt_timezone
+ {
+ $$ = cat_str(4,mm_strdup("time ("),$3,mm_strdup(")"),$5);
+}
+| TIME opt_timezone
+ {
+ $$ = cat_str(2,mm_strdup("time"),$2);
+}
+;
+
+
+ ConstInterval:
+ INTERVAL
+ {
+ $$ = mm_strdup("interval");
+}
+;
+
+
+ opt_timezone:
+ WITH_LA TIME ZONE
+ {
+ $$ = mm_strdup("with time zone");
+}
+| WITHOUT TIME ZONE
+ {
+ $$ = mm_strdup("without time zone");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_interval:
+ YEAR_P
+ {
+ $$ = mm_strdup("year");
+}
+| MONTH_P
+ {
+ $$ = mm_strdup("month");
+}
+| DAY_P
+ {
+ $$ = mm_strdup("day");
+}
+| HOUR_P
+ {
+ $$ = mm_strdup("hour");
+}
+| MINUTE_P
+ {
+ $$ = mm_strdup("minute");
+}
+| interval_second
+ {
+ $$ = $1;
+}
+| YEAR_P TO MONTH_P
+ {
+ $$ = mm_strdup("year to month");
+}
+| DAY_P TO HOUR_P
+ {
+ $$ = mm_strdup("day to hour");
+}
+| DAY_P TO MINUTE_P
+ {
+ $$ = mm_strdup("day to minute");
+}
+| DAY_P TO interval_second
+ {
+ $$ = cat_str(2,mm_strdup("day to"),$3);
+}
+| HOUR_P TO MINUTE_P
+ {
+ $$ = mm_strdup("hour to minute");
+}
+| HOUR_P TO interval_second
+ {
+ $$ = cat_str(2,mm_strdup("hour to"),$3);
+}
+| MINUTE_P TO interval_second
+ {
+ $$ = cat_str(2,mm_strdup("minute to"),$3);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ interval_second:
+ SECOND_P
+ {
+ $$ = mm_strdup("second");
+}
+| SECOND_P '(' Iconst ')'
+ {
+ $$ = cat_str(3,mm_strdup("second ("),$3,mm_strdup(")"));
+}
+;
+
+
+ a_expr:
+ c_expr
+ {
+ $$ = $1;
+}
+| a_expr TYPECAST Typename
+ {
+ $$ = cat_str(3,$1,mm_strdup("::"),$3);
+}
+| a_expr COLLATE any_name
+ {
+ $$ = cat_str(3,$1,mm_strdup("collate"),$3);
+}
+| a_expr AT TIME ZONE a_expr %prec AT
+ {
+ $$ = cat_str(3,$1,mm_strdup("at time zone"),$5);
+}
+| '+' a_expr %prec UMINUS
+ {
+ $$ = cat_str(2,mm_strdup("+"),$2);
+}
+| '-' a_expr %prec UMINUS
+ {
+ $$ = cat_str(2,mm_strdup("-"),$2);
+}
+| a_expr '+' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("+"),$3);
+}
+| a_expr '-' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("-"),$3);
+}
+| a_expr '*' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("*"),$3);
+}
+| a_expr '/' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("/"),$3);
+}
+| a_expr '%' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("%"),$3);
+}
+| a_expr '^' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("^"),$3);
+}
+| a_expr '<' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("<"),$3);
+}
+| a_expr '>' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup(">"),$3);
+}
+| a_expr '=' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("="),$3);
+}
+| a_expr LESS_EQUALS a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("<="),$3);
+}
+| a_expr GREATER_EQUALS a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup(">="),$3);
+}
+| a_expr NOT_EQUALS a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("<>"),$3);
+}
+| a_expr qual_Op a_expr %prec Op
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| qual_Op a_expr %prec Op
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| a_expr AND a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("and"),$3);
+}
+| a_expr OR a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("or"),$3);
+}
+| NOT a_expr
+ {
+ $$ = cat_str(2,mm_strdup("not"),$2);
+}
+| NOT_LA a_expr %prec NOT
+ {
+ $$ = cat_str(2,mm_strdup("not"),$2);
+}
+| a_expr LIKE a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("like"),$3);
+}
+| a_expr LIKE a_expr ESCAPE a_expr %prec LIKE
+ {
+ $$ = cat_str(5,$1,mm_strdup("like"),$3,mm_strdup("escape"),$5);
+}
+| a_expr NOT_LA LIKE a_expr %prec NOT_LA
+ {
+ $$ = cat_str(3,$1,mm_strdup("not like"),$4);
+}
+| a_expr NOT_LA LIKE a_expr ESCAPE a_expr %prec NOT_LA
+ {
+ $$ = cat_str(5,$1,mm_strdup("not like"),$4,mm_strdup("escape"),$6);
+}
+| a_expr ILIKE a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("ilike"),$3);
+}
+| a_expr ILIKE a_expr ESCAPE a_expr %prec ILIKE
+ {
+ $$ = cat_str(5,$1,mm_strdup("ilike"),$3,mm_strdup("escape"),$5);
+}
+| a_expr NOT_LA ILIKE a_expr %prec NOT_LA
+ {
+ $$ = cat_str(3,$1,mm_strdup("not ilike"),$4);
+}
+| a_expr NOT_LA ILIKE a_expr ESCAPE a_expr %prec NOT_LA
+ {
+ $$ = cat_str(5,$1,mm_strdup("not ilike"),$4,mm_strdup("escape"),$6);
+}
+| a_expr SIMILAR TO a_expr %prec SIMILAR
+ {
+ $$ = cat_str(3,$1,mm_strdup("similar to"),$4);
+}
+| a_expr SIMILAR TO a_expr ESCAPE a_expr %prec SIMILAR
+ {
+ $$ = cat_str(5,$1,mm_strdup("similar to"),$4,mm_strdup("escape"),$6);
+}
+| a_expr NOT_LA SIMILAR TO a_expr %prec NOT_LA
+ {
+ $$ = cat_str(3,$1,mm_strdup("not similar to"),$5);
+}
+| a_expr NOT_LA SIMILAR TO a_expr ESCAPE a_expr %prec NOT_LA
+ {
+ $$ = cat_str(5,$1,mm_strdup("not similar to"),$5,mm_strdup("escape"),$7);
+}
+| a_expr IS NULL_P %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is null"));
+}
+| a_expr ISNULL
+ {
+ $$ = cat_str(2,$1,mm_strdup("isnull"));
+}
+| a_expr IS NOT NULL_P %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is not null"));
+}
+| a_expr NOTNULL
+ {
+ $$ = cat_str(2,$1,mm_strdup("notnull"));
+}
+| row OVERLAPS row
+ {
+ $$ = cat_str(3,$1,mm_strdup("overlaps"),$3);
+}
+| a_expr IS TRUE_P %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is true"));
+}
+| a_expr IS NOT TRUE_P %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is not true"));
+}
+| a_expr IS FALSE_P %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is false"));
+}
+| a_expr IS NOT FALSE_P %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is not false"));
+}
+| a_expr IS UNKNOWN %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is unknown"));
+}
+| a_expr IS NOT UNKNOWN %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is not unknown"));
+}
+| a_expr IS DISTINCT FROM a_expr %prec IS
+ {
+ $$ = cat_str(3,$1,mm_strdup("is distinct from"),$5);
+}
+| a_expr IS NOT DISTINCT FROM a_expr %prec IS
+ {
+ $$ = cat_str(3,$1,mm_strdup("is not distinct from"),$6);
+}
+| a_expr BETWEEN opt_asymmetric b_expr AND a_expr %prec BETWEEN
+ {
+ $$ = cat_str(6,$1,mm_strdup("between"),$3,$4,mm_strdup("and"),$6);
+}
+| a_expr NOT_LA BETWEEN opt_asymmetric b_expr AND a_expr %prec NOT_LA
+ {
+ $$ = cat_str(6,$1,mm_strdup("not between"),$4,$5,mm_strdup("and"),$7);
+}
+| a_expr BETWEEN SYMMETRIC b_expr AND a_expr %prec BETWEEN
+ {
+ $$ = cat_str(5,$1,mm_strdup("between symmetric"),$4,mm_strdup("and"),$6);
+}
+| a_expr NOT_LA BETWEEN SYMMETRIC b_expr AND a_expr %prec NOT_LA
+ {
+ $$ = cat_str(5,$1,mm_strdup("not between symmetric"),$5,mm_strdup("and"),$7);
+}
+| a_expr IN_P in_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("in"),$3);
+}
+| a_expr NOT_LA IN_P in_expr %prec NOT_LA
+ {
+ $$ = cat_str(3,$1,mm_strdup("not in"),$4);
+}
+| a_expr subquery_Op sub_type select_with_parens %prec Op
+ {
+ $$ = cat_str(4,$1,$2,$3,$4);
+}
+| a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
+ {
+ $$ = cat_str(6,$1,$2,$3,mm_strdup("("),$5,mm_strdup(")"));
+}
+| UNIQUE select_with_parens
+ {
+mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
+ $$ = cat_str(2,mm_strdup("unique"),$2);
+}
+| a_expr IS DOCUMENT_P %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is document"));
+}
+| a_expr IS NOT DOCUMENT_P %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is not document"));
+}
+| a_expr IS NORMALIZED %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is normalized"));
+}
+| a_expr IS unicode_normal_form NORMALIZED %prec IS
+ {
+ $$ = cat_str(4,$1,mm_strdup("is"),$3,mm_strdup("normalized"));
+}
+| a_expr IS NOT NORMALIZED %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is not normalized"));
+}
+| a_expr IS NOT unicode_normal_form NORMALIZED %prec IS
+ {
+ $$ = cat_str(4,$1,mm_strdup("is not"),$4,mm_strdup("normalized"));
+}
+| DEFAULT
+ {
+ $$ = mm_strdup("default");
+}
+;
+
+
+ b_expr:
+ c_expr
+ {
+ $$ = $1;
+}
+| b_expr TYPECAST Typename
+ {
+ $$ = cat_str(3,$1,mm_strdup("::"),$3);
+}
+| '+' b_expr %prec UMINUS
+ {
+ $$ = cat_str(2,mm_strdup("+"),$2);
+}
+| '-' b_expr %prec UMINUS
+ {
+ $$ = cat_str(2,mm_strdup("-"),$2);
+}
+| b_expr '+' b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("+"),$3);
+}
+| b_expr '-' b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("-"),$3);
+}
+| b_expr '*' b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("*"),$3);
+}
+| b_expr '/' b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("/"),$3);
+}
+| b_expr '%' b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("%"),$3);
+}
+| b_expr '^' b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("^"),$3);
+}
+| b_expr '<' b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("<"),$3);
+}
+| b_expr '>' b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup(">"),$3);
+}
+| b_expr '=' b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("="),$3);
+}
+| b_expr LESS_EQUALS b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("<="),$3);
+}
+| b_expr GREATER_EQUALS b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup(">="),$3);
+}
+| b_expr NOT_EQUALS b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("<>"),$3);
+}
+| b_expr qual_Op b_expr %prec Op
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| qual_Op b_expr %prec Op
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| b_expr IS DISTINCT FROM b_expr %prec IS
+ {
+ $$ = cat_str(3,$1,mm_strdup("is distinct from"),$5);
+}
+| b_expr IS NOT DISTINCT FROM b_expr %prec IS
+ {
+ $$ = cat_str(3,$1,mm_strdup("is not distinct from"),$6);
+}
+| b_expr IS DOCUMENT_P %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is document"));
+}
+| b_expr IS NOT DOCUMENT_P %prec IS
+ {
+ $$ = cat_str(2,$1,mm_strdup("is not document"));
+}
+;
+
+
+ c_expr:
+ columnref
+ {
+ $$ = $1;
+}
+| AexprConst
+ {
+ $$ = $1;
+}
+| ecpg_param opt_indirection
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| '(' a_expr ')' opt_indirection
+ {
+ $$ = cat_str(4,mm_strdup("("),$2,mm_strdup(")"),$4);
+}
+| case_expr
+ {
+ $$ = $1;
+}
+| func_expr
+ {
+ $$ = $1;
+}
+| select_with_parens %prec UMINUS
+ {
+ $$ = $1;
+}
+| select_with_parens indirection
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| EXISTS select_with_parens
+ {
+ $$ = cat_str(2,mm_strdup("exists"),$2);
+}
+| ARRAY select_with_parens
+ {
+ $$ = cat_str(2,mm_strdup("array"),$2);
+}
+| ARRAY array_expr
+ {
+ $$ = cat_str(2,mm_strdup("array"),$2);
+}
+| explicit_row
+ {
+ $$ = $1;
+}
+| implicit_row
+ {
+ $$ = $1;
+}
+| GROUPING '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("grouping ("),$3,mm_strdup(")"));
+}
+;
+
+
+ func_application:
+ func_name '(' ')'
+ {
+ $$ = cat_str(2,$1,mm_strdup("( )"));
+}
+| func_name '(' func_arg_list opt_sort_clause ')'
+ {
+ $$ = cat_str(5,$1,mm_strdup("("),$3,$4,mm_strdup(")"));
+}
+| func_name '(' VARIADIC func_arg_expr opt_sort_clause ')'
+ {
+ $$ = cat_str(5,$1,mm_strdup("( variadic"),$4,$5,mm_strdup(")"));
+}
+| func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')'
+ {
+ $$ = cat_str(7,$1,mm_strdup("("),$3,mm_strdup(", variadic"),$6,$7,mm_strdup(")"));
+}
+| func_name '(' ALL func_arg_list opt_sort_clause ')'
+ {
+ $$ = cat_str(5,$1,mm_strdup("( all"),$4,$5,mm_strdup(")"));
+}
+| func_name '(' DISTINCT func_arg_list opt_sort_clause ')'
+ {
+ $$ = cat_str(5,$1,mm_strdup("( distinct"),$4,$5,mm_strdup(")"));
+}
+| func_name '(' '*' ')'
+ {
+ $$ = cat_str(2,$1,mm_strdup("( * )"));
+}
+;
+
+
+ func_expr:
+ func_application within_group_clause filter_clause over_clause
+ {
+ $$ = cat_str(4,$1,$2,$3,$4);
+}
+| func_expr_common_subexpr
+ {
+ $$ = $1;
+}
+;
+
+
+ func_expr_windowless:
+ func_application
+ {
+ $$ = $1;
+}
+| func_expr_common_subexpr
+ {
+ $$ = $1;
+}
+;
+
+
+ func_expr_common_subexpr:
+ COLLATION FOR '(' a_expr ')'
+ {
+ $$ = cat_str(3,mm_strdup("collation for ("),$4,mm_strdup(")"));
+}
+| CURRENT_DATE
+ {
+ $$ = mm_strdup("current_date");
+}
+| CURRENT_TIME
+ {
+ $$ = mm_strdup("current_time");
+}
+| CURRENT_TIME '(' Iconst ')'
+ {
+ $$ = cat_str(3,mm_strdup("current_time ("),$3,mm_strdup(")"));
+}
+| CURRENT_TIMESTAMP
+ {
+ $$ = mm_strdup("current_timestamp");
+}
+| CURRENT_TIMESTAMP '(' Iconst ')'
+ {
+ $$ = cat_str(3,mm_strdup("current_timestamp ("),$3,mm_strdup(")"));
+}
+| LOCALTIME
+ {
+ $$ = mm_strdup("localtime");
+}
+| LOCALTIME '(' Iconst ')'
+ {
+ $$ = cat_str(3,mm_strdup("localtime ("),$3,mm_strdup(")"));
+}
+| LOCALTIMESTAMP
+ {
+ $$ = mm_strdup("localtimestamp");
+}
+| LOCALTIMESTAMP '(' Iconst ')'
+ {
+ $$ = cat_str(3,mm_strdup("localtimestamp ("),$3,mm_strdup(")"));
+}
+| CURRENT_ROLE
+ {
+ $$ = mm_strdup("current_role");
+}
+| CURRENT_USER
+ {
+ $$ = mm_strdup("current_user");
+}
+| SESSION_USER
+ {
+ $$ = mm_strdup("session_user");
+}
+| USER
+ {
+ $$ = mm_strdup("user");
+}
+| CURRENT_CATALOG
+ {
+ $$ = mm_strdup("current_catalog");
+}
+| CURRENT_SCHEMA
+ {
+ $$ = mm_strdup("current_schema");
+}
+| CAST '(' a_expr AS Typename ')'
+ {
+ $$ = cat_str(5,mm_strdup("cast ("),$3,mm_strdup("as"),$5,mm_strdup(")"));
+}
+| EXTRACT '(' extract_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("extract ("),$3,mm_strdup(")"));
+}
+| NORMALIZE '(' a_expr ')'
+ {
+ $$ = cat_str(3,mm_strdup("normalize ("),$3,mm_strdup(")"));
+}
+| NORMALIZE '(' a_expr ',' unicode_normal_form ')'
+ {
+ $$ = cat_str(5,mm_strdup("normalize ("),$3,mm_strdup(","),$5,mm_strdup(")"));
+}
+| OVERLAY '(' overlay_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("overlay ("),$3,mm_strdup(")"));
+}
+| OVERLAY '(' func_arg_list_opt ')'
+ {
+ $$ = cat_str(3,mm_strdup("overlay ("),$3,mm_strdup(")"));
+}
+| POSITION '(' position_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("position ("),$3,mm_strdup(")"));
+}
+| SUBSTRING '(' substr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("substring ("),$3,mm_strdup(")"));
+}
+| SUBSTRING '(' func_arg_list_opt ')'
+ {
+ $$ = cat_str(3,mm_strdup("substring ("),$3,mm_strdup(")"));
+}
+| TREAT '(' a_expr AS Typename ')'
+ {
+ $$ = cat_str(5,mm_strdup("treat ("),$3,mm_strdup("as"),$5,mm_strdup(")"));
+}
+| TRIM '(' BOTH trim_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("trim ( both"),$4,mm_strdup(")"));
+}
+| TRIM '(' LEADING trim_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("trim ( leading"),$4,mm_strdup(")"));
+}
+| TRIM '(' TRAILING trim_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("trim ( trailing"),$4,mm_strdup(")"));
+}
+| TRIM '(' trim_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("trim ("),$3,mm_strdup(")"));
+}
+| NULLIF '(' a_expr ',' a_expr ')'
+ {
+ $$ = cat_str(5,mm_strdup("nullif ("),$3,mm_strdup(","),$5,mm_strdup(")"));
+}
+| COALESCE '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("coalesce ("),$3,mm_strdup(")"));
+}
+| GREATEST '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("greatest ("),$3,mm_strdup(")"));
+}
+| LEAST '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("least ("),$3,mm_strdup(")"));
+}
+| XMLCONCAT '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("xmlconcat ("),$3,mm_strdup(")"));
+}
+| XMLELEMENT '(' NAME_P ColLabel ')'
+ {
+ $$ = cat_str(3,mm_strdup("xmlelement ( name"),$4,mm_strdup(")"));
+}
+| XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ')'
+ {
+ $$ = cat_str(5,mm_strdup("xmlelement ( name"),$4,mm_strdup(","),$6,mm_strdup(")"));
+}
+| XMLELEMENT '(' NAME_P ColLabel ',' expr_list ')'
+ {
+ $$ = cat_str(5,mm_strdup("xmlelement ( name"),$4,mm_strdup(","),$6,mm_strdup(")"));
+}
+| XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ',' expr_list ')'
+ {
+ $$ = cat_str(7,mm_strdup("xmlelement ( name"),$4,mm_strdup(","),$6,mm_strdup(","),$8,mm_strdup(")"));
+}
+| XMLEXISTS '(' c_expr xmlexists_argument ')'
+ {
+ $$ = cat_str(4,mm_strdup("xmlexists ("),$3,$4,mm_strdup(")"));
+}
+| XMLFOREST '(' xml_attribute_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("xmlforest ("),$3,mm_strdup(")"));
+}
+| XMLPARSE '(' document_or_content a_expr xml_whitespace_option ')'
+ {
+ $$ = cat_str(5,mm_strdup("xmlparse ("),$3,$4,$5,mm_strdup(")"));
+}
+| XMLPI '(' NAME_P ColLabel ')'
+ {
+ $$ = cat_str(3,mm_strdup("xmlpi ( name"),$4,mm_strdup(")"));
+}
+| XMLPI '(' NAME_P ColLabel ',' a_expr ')'
+ {
+ $$ = cat_str(5,mm_strdup("xmlpi ( name"),$4,mm_strdup(","),$6,mm_strdup(")"));
+}
+| XMLROOT '(' a_expr ',' xml_root_version opt_xml_root_standalone ')'
+ {
+ $$ = cat_str(6,mm_strdup("xmlroot ("),$3,mm_strdup(","),$5,$6,mm_strdup(")"));
+}
+| XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename ')'
+ {
+ $$ = cat_str(6,mm_strdup("xmlserialize ("),$3,$4,mm_strdup("as"),$6,mm_strdup(")"));
+}
+;
+
+
+ xml_root_version:
+ VERSION_P a_expr
+ {
+ $$ = cat_str(2,mm_strdup("version"),$2);
+}
+| VERSION_P NO VALUE_P
+ {
+ $$ = mm_strdup("version no value");
+}
+;
+
+
+ opt_xml_root_standalone:
+ ',' STANDALONE_P YES_P
+ {
+ $$ = mm_strdup(", standalone yes");
+}
+| ',' STANDALONE_P NO
+ {
+ $$ = mm_strdup(", standalone no");
+}
+| ',' STANDALONE_P NO VALUE_P
+ {
+ $$ = mm_strdup(", standalone no value");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ xml_attributes:
+ XMLATTRIBUTES '(' xml_attribute_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("xmlattributes ("),$3,mm_strdup(")"));
+}
+;
+
+
+ xml_attribute_list:
+ xml_attribute_el
+ {
+ $$ = $1;
+}
+| xml_attribute_list ',' xml_attribute_el
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ xml_attribute_el:
+ a_expr AS ColLabel
+ {
+ $$ = cat_str(3,$1,mm_strdup("as"),$3);
+}
+| a_expr
+ {
+ $$ = $1;
+}
+;
+
+
+ document_or_content:
+ DOCUMENT_P
+ {
+ $$ = mm_strdup("document");
+}
+| CONTENT_P
+ {
+ $$ = mm_strdup("content");
+}
+;
+
+
+ xml_whitespace_option:
+ PRESERVE WHITESPACE_P
+ {
+ $$ = mm_strdup("preserve whitespace");
+}
+| STRIP_P WHITESPACE_P
+ {
+ $$ = mm_strdup("strip whitespace");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ xmlexists_argument:
+ PASSING c_expr
+ {
+ $$ = cat_str(2,mm_strdup("passing"),$2);
+}
+| PASSING c_expr xml_passing_mech
+ {
+ $$ = cat_str(3,mm_strdup("passing"),$2,$3);
+}
+| PASSING xml_passing_mech c_expr
+ {
+ $$ = cat_str(3,mm_strdup("passing"),$2,$3);
+}
+| PASSING xml_passing_mech c_expr xml_passing_mech
+ {
+ $$ = cat_str(4,mm_strdup("passing"),$2,$3,$4);
+}
+;
+
+
+ xml_passing_mech:
+ BY REF
+ {
+ $$ = mm_strdup("by ref");
+}
+| BY VALUE_P
+ {
+ $$ = mm_strdup("by value");
+}
+;
+
+
+ within_group_clause:
+ WITHIN GROUP_P '(' sort_clause ')'
+ {
+ $$ = cat_str(3,mm_strdup("within group ("),$4,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ filter_clause:
+ FILTER '(' WHERE a_expr ')'
+ {
+ $$ = cat_str(3,mm_strdup("filter ( where"),$4,mm_strdup(")"));
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ window_clause:
+ WINDOW window_definition_list
+ {
+ $$ = cat_str(2,mm_strdup("window"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ window_definition_list:
+ window_definition
+ {
+ $$ = $1;
+}
+| window_definition_list ',' window_definition
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ window_definition:
+ ColId AS window_specification
+ {
+ $$ = cat_str(3,$1,mm_strdup("as"),$3);
+}
+;
+
+
+ over_clause:
+ OVER window_specification
+ {
+ $$ = cat_str(2,mm_strdup("over"),$2);
+}
+| OVER ColId
+ {
+ $$ = cat_str(2,mm_strdup("over"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ window_specification:
+ '(' opt_existing_window_name opt_partition_clause opt_sort_clause opt_frame_clause ')'
+ {
+ $$ = cat_str(6,mm_strdup("("),$2,$3,$4,$5,mm_strdup(")"));
+}
+;
+
+
+ opt_existing_window_name:
+ ColId
+ {
+ $$ = $1;
+}
+| %prec Op
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_partition_clause:
+ PARTITION BY expr_list
+ {
+ $$ = cat_str(2,mm_strdup("partition by"),$3);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_frame_clause:
+ RANGE frame_extent opt_window_exclusion_clause
+ {
+ $$ = cat_str(3,mm_strdup("range"),$2,$3);
+}
+| ROWS frame_extent opt_window_exclusion_clause
+ {
+ $$ = cat_str(3,mm_strdup("rows"),$2,$3);
+}
+| GROUPS frame_extent opt_window_exclusion_clause
+ {
+ $$ = cat_str(3,mm_strdup("groups"),$2,$3);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ frame_extent:
+ frame_bound
+ {
+ $$ = $1;
+}
+| BETWEEN frame_bound AND frame_bound
+ {
+ $$ = cat_str(4,mm_strdup("between"),$2,mm_strdup("and"),$4);
+}
+;
+
+
+ frame_bound:
+ UNBOUNDED PRECEDING
+ {
+ $$ = mm_strdup("unbounded preceding");
+}
+| UNBOUNDED FOLLOWING
+ {
+ $$ = mm_strdup("unbounded following");
+}
+| CURRENT_P ROW
+ {
+ $$ = mm_strdup("current row");
+}
+| a_expr PRECEDING
+ {
+ $$ = cat_str(2,$1,mm_strdup("preceding"));
+}
+| a_expr FOLLOWING
+ {
+ $$ = cat_str(2,$1,mm_strdup("following"));
+}
+;
+
+
+ opt_window_exclusion_clause:
+ EXCLUDE CURRENT_P ROW
+ {
+ $$ = mm_strdup("exclude current row");
+}
+| EXCLUDE GROUP_P
+ {
+ $$ = mm_strdup("exclude group");
+}
+| EXCLUDE TIES
+ {
+ $$ = mm_strdup("exclude ties");
+}
+| EXCLUDE NO OTHERS
+ {
+ $$ = mm_strdup("exclude no others");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ row:
+ ROW '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("row ("),$3,mm_strdup(")"));
+}
+| ROW '(' ')'
+ {
+ $$ = mm_strdup("row ( )");
+}
+| '(' expr_list ',' a_expr ')'
+ {
+ $$ = cat_str(5,mm_strdup("("),$2,mm_strdup(","),$4,mm_strdup(")"));
+}
+;
+
+
+ explicit_row:
+ ROW '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("row ("),$3,mm_strdup(")"));
+}
+| ROW '(' ')'
+ {
+ $$ = mm_strdup("row ( )");
+}
+;
+
+
+ implicit_row:
+ '(' expr_list ',' a_expr ')'
+ {
+ $$ = cat_str(5,mm_strdup("("),$2,mm_strdup(","),$4,mm_strdup(")"));
+}
+;
+
+
+ sub_type:
+ ANY
+ {
+ $$ = mm_strdup("any");
+}
+| SOME
+ {
+ $$ = mm_strdup("some");
+}
+| ALL
+ {
+ $$ = mm_strdup("all");
+}
+;
+
+
+ all_Op:
+ Op
+ {
+ $$ = $1;
+}
+| MathOp
+ {
+ $$ = $1;
+}
+;
+
+
+ MathOp:
+ '+'
+ {
+ $$ = mm_strdup("+");
+}
+| '-'
+ {
+ $$ = mm_strdup("-");
+}
+| '*'
+ {
+ $$ = mm_strdup("*");
+}
+| '/'
+ {
+ $$ = mm_strdup("/");
+}
+| '%'
+ {
+ $$ = mm_strdup("%");
+}
+| '^'
+ {
+ $$ = mm_strdup("^");
+}
+| '<'
+ {
+ $$ = mm_strdup("<");
+}
+| '>'
+ {
+ $$ = mm_strdup(">");
+}
+| '='
+ {
+ $$ = mm_strdup("=");
+}
+| LESS_EQUALS
+ {
+ $$ = mm_strdup("<=");
+}
+| GREATER_EQUALS
+ {
+ $$ = mm_strdup(">=");
+}
+| NOT_EQUALS
+ {
+ $$ = mm_strdup("<>");
+}
+;
+
+
+ qual_Op:
+ Op
+ {
+ $$ = $1;
+}
+| OPERATOR '(' any_operator ')'
+ {
+ $$ = cat_str(3,mm_strdup("operator ("),$3,mm_strdup(")"));
+}
+;
+
+
+ qual_all_Op:
+ all_Op
+ {
+ $$ = $1;
+}
+| OPERATOR '(' any_operator ')'
+ {
+ $$ = cat_str(3,mm_strdup("operator ("),$3,mm_strdup(")"));
+}
+;
+
+
+ subquery_Op:
+ all_Op
+ {
+ $$ = $1;
+}
+| OPERATOR '(' any_operator ')'
+ {
+ $$ = cat_str(3,mm_strdup("operator ("),$3,mm_strdup(")"));
+}
+| LIKE
+ {
+ $$ = mm_strdup("like");
+}
+| NOT_LA LIKE
+ {
+ $$ = mm_strdup("not like");
+}
+| ILIKE
+ {
+ $$ = mm_strdup("ilike");
+}
+| NOT_LA ILIKE
+ {
+ $$ = mm_strdup("not ilike");
+}
+;
+
+
+ expr_list:
+ a_expr
+ {
+ $$ = $1;
+}
+| expr_list ',' a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ func_arg_list:
+ func_arg_expr
+ {
+ $$ = $1;
+}
+| func_arg_list ',' func_arg_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ func_arg_expr:
+ a_expr
+ {
+ $$ = $1;
+}
+| param_name COLON_EQUALS a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup(":="),$3);
+}
+| param_name EQUALS_GREATER a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("=>"),$3);
+}
+;
+
+
+ func_arg_list_opt:
+ func_arg_list
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ type_list:
+ Typename
+ {
+ $$ = $1;
+}
+| type_list ',' Typename
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ array_expr:
+ '[' expr_list ']'
+ {
+ $$ = cat_str(3,mm_strdup("["),$2,mm_strdup("]"));
+}
+| '[' array_expr_list ']'
+ {
+ $$ = cat_str(3,mm_strdup("["),$2,mm_strdup("]"));
+}
+| '[' ']'
+ {
+ $$ = mm_strdup("[ ]");
+}
+;
+
+
+ array_expr_list:
+ array_expr
+ {
+ $$ = $1;
+}
+| array_expr_list ',' array_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ extract_list:
+ extract_arg FROM a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("from"),$3);
+}
+;
+
+
+ extract_arg:
+ ecpg_ident
+ {
+ $$ = $1;
+}
+| YEAR_P
+ {
+ $$ = mm_strdup("year");
+}
+| MONTH_P
+ {
+ $$ = mm_strdup("month");
+}
+| DAY_P
+ {
+ $$ = mm_strdup("day");
+}
+| HOUR_P
+ {
+ $$ = mm_strdup("hour");
+}
+| MINUTE_P
+ {
+ $$ = mm_strdup("minute");
+}
+| SECOND_P
+ {
+ $$ = mm_strdup("second");
+}
+| ecpg_sconst
+ {
+ $$ = $1;
+}
+;
+
+
+ unicode_normal_form:
+ NFC
+ {
+ $$ = mm_strdup("nfc");
+}
+| NFD
+ {
+ $$ = mm_strdup("nfd");
+}
+| NFKC
+ {
+ $$ = mm_strdup("nfkc");
+}
+| NFKD
+ {
+ $$ = mm_strdup("nfkd");
+}
+;
+
+
+ overlay_list:
+ a_expr PLACING a_expr FROM a_expr FOR a_expr
+ {
+ $$ = cat_str(7,$1,mm_strdup("placing"),$3,mm_strdup("from"),$5,mm_strdup("for"),$7);
+}
+| a_expr PLACING a_expr FROM a_expr
+ {
+ $$ = cat_str(5,$1,mm_strdup("placing"),$3,mm_strdup("from"),$5);
+}
+;
+
+
+ position_list:
+ b_expr IN_P b_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("in"),$3);
+}
+;
+
+
+ substr_list:
+ a_expr FROM a_expr FOR a_expr
+ {
+ $$ = cat_str(5,$1,mm_strdup("from"),$3,mm_strdup("for"),$5);
+}
+| a_expr FOR a_expr FROM a_expr
+ {
+ $$ = cat_str(5,$1,mm_strdup("for"),$3,mm_strdup("from"),$5);
+}
+| a_expr FROM a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("from"),$3);
+}
+| a_expr FOR a_expr
+ {
+ $$ = cat_str(3,$1,mm_strdup("for"),$3);
+}
+| a_expr SIMILAR a_expr ESCAPE a_expr
+ {
+ $$ = cat_str(5,$1,mm_strdup("similar"),$3,mm_strdup("escape"),$5);
+}
+;
+
+
+ trim_list:
+ a_expr FROM expr_list
+ {
+ $$ = cat_str(3,$1,mm_strdup("from"),$3);
+}
+| FROM expr_list
+ {
+ $$ = cat_str(2,mm_strdup("from"),$2);
+}
+| expr_list
+ {
+ $$ = $1;
+}
+;
+
+
+ in_expr:
+ select_with_parens
+ {
+ $$ = $1;
+}
+| '(' expr_list ')'
+ {
+ $$ = cat_str(3,mm_strdup("("),$2,mm_strdup(")"));
+}
+;
+
+
+ case_expr:
+ CASE case_arg when_clause_list case_default END_P
+ {
+ $$ = cat_str(5,mm_strdup("case"),$2,$3,$4,mm_strdup("end"));
+}
+;
+
+
+ when_clause_list:
+ when_clause
+ {
+ $$ = $1;
+}
+| when_clause_list when_clause
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ when_clause:
+ WHEN a_expr THEN a_expr
+ {
+ $$ = cat_str(4,mm_strdup("when"),$2,mm_strdup("then"),$4);
+}
+;
+
+
+ case_default:
+ ELSE a_expr
+ {
+ $$ = cat_str(2,mm_strdup("else"),$2);
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ case_arg:
+ a_expr
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ columnref:
+ ColId
+ {
+ $$ = $1;
+}
+| ColId indirection
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ indirection_el:
+ '.' attr_name
+ {
+ $$ = cat_str(2,mm_strdup("."),$2);
+}
+| '.' '*'
+ {
+ $$ = mm_strdup(". *");
+}
+| '[' a_expr ']'
+ {
+ $$ = cat_str(3,mm_strdup("["),$2,mm_strdup("]"));
+}
+| '[' opt_slice_bound ':' opt_slice_bound ']'
+ {
+ $$ = cat_str(5,mm_strdup("["),$2,mm_strdup(":"),$4,mm_strdup("]"));
+}
+;
+
+
+ opt_slice_bound:
+ a_expr
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ indirection:
+ indirection_el
+ {
+ $$ = $1;
+}
+| indirection indirection_el
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ opt_indirection:
+
+ {
+ $$=EMPTY; }
+| opt_indirection indirection_el
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ opt_asymmetric:
+ ASYMMETRIC
+ {
+ $$ = mm_strdup("asymmetric");
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ opt_target_list:
+ target_list
+ {
+ $$ = $1;
+}
+|
+ {
+ $$=EMPTY; }
+;
+
+
+ target_list:
+ target_el
+ {
+ $$ = $1;
+}
+| target_list ',' target_el
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ target_el:
+ a_expr AS ColLabel
+ {
+ $$ = cat_str(3,$1,mm_strdup("as"),$3);
+}
+| a_expr BareColLabel
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| a_expr
+ {
+ $$ = $1;
+}
+| '*'
+ {
+ $$ = mm_strdup("*");
+}
+;
+
+
+ qualified_name_list:
+ qualified_name
+ {
+ $$ = $1;
+}
+| qualified_name_list ',' qualified_name
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ qualified_name:
+ ColId
+ {
+ $$ = $1;
+}
+| ColId indirection
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ name_list:
+ name
+ {
+ $$ = $1;
+}
+| name_list ',' name
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ name:
+ ColId
+ {
+ $$ = $1;
+}
+;
+
+
+ attr_name:
+ ColLabel
+ {
+ $$ = $1;
+}
+;
+
+
+ file_name:
+ ecpg_sconst
+ {
+ $$ = $1;
+}
+;
+
+
+ func_name:
+ type_function_name
+ {
+ $$ = $1;
+}
+| ColId indirection
+ {
+ $$ = cat_str(2,$1,$2);
+}
+;
+
+
+ AexprConst:
+ Iconst
+ {
+ $$ = $1;
+}
+| ecpg_fconst
+ {
+ $$ = $1;
+}
+| ecpg_sconst
+ {
+ $$ = $1;
+}
+| ecpg_bconst
+ {
+ $$ = $1;
+}
+| ecpg_xconst
+ {
+ $$ = $1;
+}
+| func_name ecpg_sconst
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| func_name '(' func_arg_list opt_sort_clause ')' ecpg_sconst
+ {
+ $$ = cat_str(6,$1,mm_strdup("("),$3,$4,mm_strdup(")"),$6);
+}
+| ConstTypename ecpg_sconst
+ {
+ $$ = cat_str(2,$1,$2);
+}
+| ConstInterval ecpg_sconst opt_interval
+ {
+ $$ = cat_str(3,$1,$2,$3);
+}
+| ConstInterval '(' Iconst ')' ecpg_sconst
+ {
+ $$ = cat_str(5,$1,mm_strdup("("),$3,mm_strdup(")"),$5);
+}
+| TRUE_P
+ {
+ $$ = mm_strdup("true");
+}
+| FALSE_P
+ {
+ $$ = mm_strdup("false");
+}
+| NULL_P
+ {
+ $$ = mm_strdup("null");
+}
+ | civar { $$ = $1; }
+ | civarind { $$ = $1; }
+;
+
+
+ Iconst:
+ ICONST
+ { $$ = make_name(); }
+;
+
+
+ SignedIconst:
+ Iconst
+ {
+ $$ = $1;
+}
+ | civar { $$ = $1; }
+| '+' Iconst
+ {
+ $$ = cat_str(2,mm_strdup("+"),$2);
+}
+| '-' Iconst
+ {
+ $$ = cat_str(2,mm_strdup("-"),$2);
+}
+;
+
+
+ RoleId:
+ RoleSpec
+ {
+ $$ = $1;
+}
+;
+
+
+ RoleSpec:
+ NonReservedWord
+ {
+ $$ = $1;
+}
+| CURRENT_ROLE
+ {
+ $$ = mm_strdup("current_role");
+}
+| CURRENT_USER
+ {
+ $$ = mm_strdup("current_user");
+}
+| SESSION_USER
+ {
+ $$ = mm_strdup("session_user");
+}
+;
+
+
+ role_list:
+ RoleSpec
+ {
+ $$ = $1;
+}
+| role_list ',' RoleSpec
+ {
+ $$ = cat_str(3,$1,mm_strdup(","),$3);
+}
+;
+
+
+ NonReservedWord:
+ ecpg_ident
+ {
+ $$ = $1;
+}
+| unreserved_keyword
+ {
+ $$ = $1;
+}
+| col_name_keyword
+ {
+ $$ = $1;
+}
+| type_func_name_keyword
+ {
+ $$ = $1;
+}
+;
+
+
+ BareColLabel:
+ ecpg_ident
+ {
+ $$ = $1;
+}
+| bare_label_keyword
+ {
+ $$ = $1;
+}
+;
+
+
+ unreserved_keyword:
+ ABORT_P
+ {
+ $$ = mm_strdup("abort");
+}
+| ABSOLUTE_P
+ {
+ $$ = mm_strdup("absolute");
+}
+| ACCESS
+ {
+ $$ = mm_strdup("access");
+}
+| ACTION
+ {
+ $$ = mm_strdup("action");
+}
+| ADD_P
+ {
+ $$ = mm_strdup("add");
+}
+| ADMIN
+ {
+ $$ = mm_strdup("admin");
+}
+| AFTER
+ {
+ $$ = mm_strdup("after");
+}
+| AGGREGATE
+ {
+ $$ = mm_strdup("aggregate");
+}
+| ALSO
+ {
+ $$ = mm_strdup("also");
+}
+| ALTER
+ {
+ $$ = mm_strdup("alter");
+}
+| ALWAYS
+ {
+ $$ = mm_strdup("always");
+}
+| ASENSITIVE
+ {
+ $$ = mm_strdup("asensitive");
+}
+| ASSERTION
+ {
+ $$ = mm_strdup("assertion");
+}
+| ASSIGNMENT
+ {
+ $$ = mm_strdup("assignment");
+}
+| AT
+ {
+ $$ = mm_strdup("at");
+}
+| ATOMIC
+ {
+ $$ = mm_strdup("atomic");
+}
+| ATTACH
+ {
+ $$ = mm_strdup("attach");
+}
+| ATTRIBUTE
+ {
+ $$ = mm_strdup("attribute");
+}
+| BACKWARD
+ {
+ $$ = mm_strdup("backward");
+}
+| BEFORE
+ {
+ $$ = mm_strdup("before");
+}
+| BEGIN_P
+ {
+ $$ = mm_strdup("begin");
+}
+| BREADTH
+ {
+ $$ = mm_strdup("breadth");
+}
+| BY
+ {
+ $$ = mm_strdup("by");
+}
+| CACHE
+ {
+ $$ = mm_strdup("cache");
+}
+| CALL
+ {
+ $$ = mm_strdup("call");
+}
+| CALLED
+ {
+ $$ = mm_strdup("called");
+}
+| CASCADE
+ {
+ $$ = mm_strdup("cascade");
+}
+| CASCADED
+ {
+ $$ = mm_strdup("cascaded");
+}
+| CATALOG_P
+ {
+ $$ = mm_strdup("catalog");
+}
+| CHAIN
+ {
+ $$ = mm_strdup("chain");
+}
+| CHARACTERISTICS
+ {
+ $$ = mm_strdup("characteristics");
+}
+| CHECKPOINT
+ {
+ $$ = mm_strdup("checkpoint");
+}
+| CLASS
+ {
+ $$ = mm_strdup("class");
+}
+| CLOSE
+ {
+ $$ = mm_strdup("close");
+}
+| CLUSTER
+ {
+ $$ = mm_strdup("cluster");
+}
+| COLUMNS
+ {
+ $$ = mm_strdup("columns");
+}
+| COMMENT
+ {
+ $$ = mm_strdup("comment");
+}
+| COMMENTS
+ {
+ $$ = mm_strdup("comments");
+}
+| COMMIT
+ {
+ $$ = mm_strdup("commit");
+}
+| COMMITTED
+ {
+ $$ = mm_strdup("committed");
+}
+| COMPRESSION
+ {
+ $$ = mm_strdup("compression");
+}
+| CONFIGURATION
+ {
+ $$ = mm_strdup("configuration");
+}
+| CONFLICT
+ {
+ $$ = mm_strdup("conflict");
+}
+| CONSTRAINTS
+ {
+ $$ = mm_strdup("constraints");
+}
+| CONTENT_P
+ {
+ $$ = mm_strdup("content");
+}
+| CONTINUE_P
+ {
+ $$ = mm_strdup("continue");
+}
+| CONVERSION_P
+ {
+ $$ = mm_strdup("conversion");
+}
+| COPY
+ {
+ $$ = mm_strdup("copy");
+}
+| COST
+ {
+ $$ = mm_strdup("cost");
+}
+| CSV
+ {
+ $$ = mm_strdup("csv");
+}
+| CUBE
+ {
+ $$ = mm_strdup("cube");
+}
+| CURSOR
+ {
+ $$ = mm_strdup("cursor");
+}
+| CYCLE
+ {
+ $$ = mm_strdup("cycle");
+}
+| DATA_P
+ {
+ $$ = mm_strdup("data");
+}
+| DATABASE
+ {
+ $$ = mm_strdup("database");
+}
+| DEALLOCATE
+ {
+ $$ = mm_strdup("deallocate");
+}
+| DECLARE
+ {
+ $$ = mm_strdup("declare");
+}
+| DEFAULTS
+ {
+ $$ = mm_strdup("defaults");
+}
+| DEFERRED
+ {
+ $$ = mm_strdup("deferred");
+}
+| DEFINER
+ {
+ $$ = mm_strdup("definer");
+}
+| DELETE_P
+ {
+ $$ = mm_strdup("delete");
+}
+| DELIMITER
+ {
+ $$ = mm_strdup("delimiter");
+}
+| DELIMITERS
+ {
+ $$ = mm_strdup("delimiters");
+}
+| DEPENDS
+ {
+ $$ = mm_strdup("depends");
+}
+| DEPTH
+ {
+ $$ = mm_strdup("depth");
+}
+| DETACH
+ {
+ $$ = mm_strdup("detach");
+}
+| DICTIONARY
+ {
+ $$ = mm_strdup("dictionary");
+}
+| DISABLE_P
+ {
+ $$ = mm_strdup("disable");
+}
+| DISCARD
+ {
+ $$ = mm_strdup("discard");
+}
+| DOCUMENT_P
+ {
+ $$ = mm_strdup("document");
+}
+| DOMAIN_P
+ {
+ $$ = mm_strdup("domain");
+}
+| DOUBLE_P
+ {
+ $$ = mm_strdup("double");
+}
+| DROP
+ {
+ $$ = mm_strdup("drop");
+}
+| EACH
+ {
+ $$ = mm_strdup("each");
+}
+| ENABLE_P
+ {
+ $$ = mm_strdup("enable");
+}
+| ENCODING
+ {
+ $$ = mm_strdup("encoding");
+}
+| ENCRYPTED
+ {
+ $$ = mm_strdup("encrypted");
+}
+| ENUM_P
+ {
+ $$ = mm_strdup("enum");
+}
+| ESCAPE
+ {
+ $$ = mm_strdup("escape");
+}
+| EVENT
+ {
+ $$ = mm_strdup("event");
+}
+| EXCLUDE
+ {
+ $$ = mm_strdup("exclude");
+}
+| EXCLUDING
+ {
+ $$ = mm_strdup("excluding");
+}
+| EXCLUSIVE
+ {
+ $$ = mm_strdup("exclusive");
+}
+| EXECUTE
+ {
+ $$ = mm_strdup("execute");
+}
+| EXPLAIN
+ {
+ $$ = mm_strdup("explain");
+}
+| EXPRESSION
+ {
+ $$ = mm_strdup("expression");
+}
+| EXTENSION
+ {
+ $$ = mm_strdup("extension");
+}
+| EXTERNAL
+ {
+ $$ = mm_strdup("external");
+}
+| FAMILY
+ {
+ $$ = mm_strdup("family");
+}
+| FILTER
+ {
+ $$ = mm_strdup("filter");
+}
+| FINALIZE
+ {
+ $$ = mm_strdup("finalize");
+}
+| FIRST_P
+ {
+ $$ = mm_strdup("first");
+}
+| FOLLOWING
+ {
+ $$ = mm_strdup("following");
+}
+| FORCE
+ {
+ $$ = mm_strdup("force");
+}
+| FORWARD
+ {
+ $$ = mm_strdup("forward");
+}
+| FUNCTION
+ {
+ $$ = mm_strdup("function");
+}
+| FUNCTIONS
+ {
+ $$ = mm_strdup("functions");
+}
+| GENERATED
+ {
+ $$ = mm_strdup("generated");
+}
+| GLOBAL
+ {
+ $$ = mm_strdup("global");
+}
+| GRANTED
+ {
+ $$ = mm_strdup("granted");
+}
+| GROUPS
+ {
+ $$ = mm_strdup("groups");
+}
+| HANDLER
+ {
+ $$ = mm_strdup("handler");
+}
+| HEADER_P
+ {
+ $$ = mm_strdup("header");
+}
+| HOLD
+ {
+ $$ = mm_strdup("hold");
+}
+| IDENTITY_P
+ {
+ $$ = mm_strdup("identity");
+}
+| IF_P
+ {
+ $$ = mm_strdup("if");
+}
+| IMMEDIATE
+ {
+ $$ = mm_strdup("immediate");
+}
+| IMMUTABLE
+ {
+ $$ = mm_strdup("immutable");
+}
+| IMPLICIT_P
+ {
+ $$ = mm_strdup("implicit");
+}
+| IMPORT_P
+ {
+ $$ = mm_strdup("import");
+}
+| INCLUDE
+ {
+ $$ = mm_strdup("include");
+}
+| INCLUDING
+ {
+ $$ = mm_strdup("including");
+}
+| INCREMENT
+ {
+ $$ = mm_strdup("increment");
+}
+| INDEX
+ {
+ $$ = mm_strdup("index");
+}
+| INDEXES
+ {
+ $$ = mm_strdup("indexes");
+}
+| INHERIT
+ {
+ $$ = mm_strdup("inherit");
+}
+| INHERITS
+ {
+ $$ = mm_strdup("inherits");
+}
+| INLINE_P
+ {
+ $$ = mm_strdup("inline");
+}
+| INSENSITIVE
+ {
+ $$ = mm_strdup("insensitive");
+}
+| INSERT
+ {
+ $$ = mm_strdup("insert");
+}
+| INSTEAD
+ {
+ $$ = mm_strdup("instead");
+}
+| INVOKER
+ {
+ $$ = mm_strdup("invoker");
+}
+| ISOLATION
+ {
+ $$ = mm_strdup("isolation");
+}
+| KEY
+ {
+ $$ = mm_strdup("key");
+}
+| LABEL
+ {
+ $$ = mm_strdup("label");
+}
+| LANGUAGE
+ {
+ $$ = mm_strdup("language");
+}
+| LARGE_P
+ {
+ $$ = mm_strdup("large");
+}
+| LAST_P
+ {
+ $$ = mm_strdup("last");
+}
+| LEAKPROOF
+ {
+ $$ = mm_strdup("leakproof");
+}
+| LEVEL
+ {
+ $$ = mm_strdup("level");
+}
+| LISTEN
+ {
+ $$ = mm_strdup("listen");
+}
+| LOAD
+ {
+ $$ = mm_strdup("load");
+}
+| LOCAL
+ {
+ $$ = mm_strdup("local");
+}
+| LOCATION
+ {
+ $$ = mm_strdup("location");
+}
+| LOCK_P
+ {
+ $$ = mm_strdup("lock");
+}
+| LOCKED
+ {
+ $$ = mm_strdup("locked");
+}
+| LOGGED
+ {
+ $$ = mm_strdup("logged");
+}
+| MAPPING
+ {
+ $$ = mm_strdup("mapping");
+}
+| MATCH
+ {
+ $$ = mm_strdup("match");
+}
+| MATERIALIZED
+ {
+ $$ = mm_strdup("materialized");
+}
+| MAXVALUE
+ {
+ $$ = mm_strdup("maxvalue");
+}
+| METHOD
+ {
+ $$ = mm_strdup("method");
+}
+| MINVALUE
+ {
+ $$ = mm_strdup("minvalue");
+}
+| MODE
+ {
+ $$ = mm_strdup("mode");
+}
+| MOVE
+ {
+ $$ = mm_strdup("move");
+}
+| NAME_P
+ {
+ $$ = mm_strdup("name");
+}
+| NAMES
+ {
+ $$ = mm_strdup("names");
+}
+| NEW
+ {
+ $$ = mm_strdup("new");
+}
+| NEXT
+ {
+ $$ = mm_strdup("next");
+}
+| NFC
+ {
+ $$ = mm_strdup("nfc");
+}
+| NFD
+ {
+ $$ = mm_strdup("nfd");
+}
+| NFKC
+ {
+ $$ = mm_strdup("nfkc");
+}
+| NFKD
+ {
+ $$ = mm_strdup("nfkd");
+}
+| NO
+ {
+ $$ = mm_strdup("no");
+}
+| NORMALIZED
+ {
+ $$ = mm_strdup("normalized");
+}
+| NOTHING
+ {
+ $$ = mm_strdup("nothing");
+}
+| NOTIFY
+ {
+ $$ = mm_strdup("notify");
+}
+| NOWAIT
+ {
+ $$ = mm_strdup("nowait");
+}
+| NULLS_P
+ {
+ $$ = mm_strdup("nulls");
+}
+| OBJECT_P
+ {
+ $$ = mm_strdup("object");
+}
+| OF
+ {
+ $$ = mm_strdup("of");
+}
+| OFF
+ {
+ $$ = mm_strdup("off");
+}
+| OIDS
+ {
+ $$ = mm_strdup("oids");
+}
+| OLD
+ {
+ $$ = mm_strdup("old");
+}
+| OPERATOR
+ {
+ $$ = mm_strdup("operator");
+}
+| OPTION
+ {
+ $$ = mm_strdup("option");
+}
+| OPTIONS
+ {
+ $$ = mm_strdup("options");
+}
+| ORDINALITY
+ {
+ $$ = mm_strdup("ordinality");
+}
+| OTHERS
+ {
+ $$ = mm_strdup("others");
+}
+| OVER
+ {
+ $$ = mm_strdup("over");
+}
+| OVERRIDING
+ {
+ $$ = mm_strdup("overriding");
+}
+| OWNED
+ {
+ $$ = mm_strdup("owned");
+}
+| OWNER
+ {
+ $$ = mm_strdup("owner");
+}
+| PARALLEL
+ {
+ $$ = mm_strdup("parallel");
+}
+| PARSER
+ {
+ $$ = mm_strdup("parser");
+}
+| PARTIAL
+ {
+ $$ = mm_strdup("partial");
+}
+| PARTITION
+ {
+ $$ = mm_strdup("partition");
+}
+| PASSING
+ {
+ $$ = mm_strdup("passing");
+}
+| PASSWORD
+ {
+ $$ = mm_strdup("password");
+}
+| PLANS
+ {
+ $$ = mm_strdup("plans");
+}
+| POLICY
+ {
+ $$ = mm_strdup("policy");
+}
+| PRECEDING
+ {
+ $$ = mm_strdup("preceding");
+}
+| PREPARE
+ {
+ $$ = mm_strdup("prepare");
+}
+| PREPARED
+ {
+ $$ = mm_strdup("prepared");
+}
+| PRESERVE
+ {
+ $$ = mm_strdup("preserve");
+}
+| PRIOR
+ {
+ $$ = mm_strdup("prior");
+}
+| PRIVILEGES
+ {
+ $$ = mm_strdup("privileges");
+}
+| PROCEDURAL
+ {
+ $$ = mm_strdup("procedural");
+}
+| PROCEDURE
+ {
+ $$ = mm_strdup("procedure");
+}
+| PROCEDURES
+ {
+ $$ = mm_strdup("procedures");
+}
+| PROGRAM
+ {
+ $$ = mm_strdup("program");
+}
+| PUBLICATION
+ {
+ $$ = mm_strdup("publication");
+}
+| QUOTE
+ {
+ $$ = mm_strdup("quote");
+}
+| RANGE
+ {
+ $$ = mm_strdup("range");
+}
+| READ
+ {
+ $$ = mm_strdup("read");
+}
+| REASSIGN
+ {
+ $$ = mm_strdup("reassign");
+}
+| RECHECK
+ {
+ $$ = mm_strdup("recheck");
+}
+| RECURSIVE
+ {
+ $$ = mm_strdup("recursive");
+}
+| REF
+ {
+ $$ = mm_strdup("ref");
+}
+| REFERENCING
+ {
+ $$ = mm_strdup("referencing");
+}
+| REFRESH
+ {
+ $$ = mm_strdup("refresh");
+}
+| REINDEX
+ {
+ $$ = mm_strdup("reindex");
+}
+| RELATIVE_P
+ {
+ $$ = mm_strdup("relative");
+}
+| RELEASE
+ {
+ $$ = mm_strdup("release");
+}
+| RENAME
+ {
+ $$ = mm_strdup("rename");
+}
+| REPEATABLE
+ {
+ $$ = mm_strdup("repeatable");
+}
+| REPLACE
+ {
+ $$ = mm_strdup("replace");
+}
+| REPLICA
+ {
+ $$ = mm_strdup("replica");
+}
+| RESET
+ {
+ $$ = mm_strdup("reset");
+}
+| RESTART
+ {
+ $$ = mm_strdup("restart");
+}
+| RESTRICT
+ {
+ $$ = mm_strdup("restrict");
+}
+| RETURN
+ {
+ $$ = mm_strdup("return");
+}
+| RETURNS
+ {
+ $$ = mm_strdup("returns");
+}
+| REVOKE
+ {
+ $$ = mm_strdup("revoke");
+}
+| ROLE
+ {
+ $$ = mm_strdup("role");
+}
+| ROLLBACK
+ {
+ $$ = mm_strdup("rollback");
+}
+| ROLLUP
+ {
+ $$ = mm_strdup("rollup");
+}
+| ROUTINE
+ {
+ $$ = mm_strdup("routine");
+}
+| ROUTINES
+ {
+ $$ = mm_strdup("routines");
+}
+| ROWS
+ {
+ $$ = mm_strdup("rows");
+}
+| RULE
+ {
+ $$ = mm_strdup("rule");
+}
+| SAVEPOINT
+ {
+ $$ = mm_strdup("savepoint");
+}
+| SCHEMA
+ {
+ $$ = mm_strdup("schema");
+}
+| SCHEMAS
+ {
+ $$ = mm_strdup("schemas");
+}
+| SCROLL
+ {
+ $$ = mm_strdup("scroll");
+}
+| SEARCH
+ {
+ $$ = mm_strdup("search");
+}
+| SECURITY
+ {
+ $$ = mm_strdup("security");
+}
+| SEQUENCE
+ {
+ $$ = mm_strdup("sequence");
+}
+| SEQUENCES
+ {
+ $$ = mm_strdup("sequences");
+}
+| SERIALIZABLE
+ {
+ $$ = mm_strdup("serializable");
+}
+| SERVER
+ {
+ $$ = mm_strdup("server");
+}
+| SESSION
+ {
+ $$ = mm_strdup("session");
+}
+| SET
+ {
+ $$ = mm_strdup("set");
+}
+| SETS
+ {
+ $$ = mm_strdup("sets");
+}
+| SHARE
+ {
+ $$ = mm_strdup("share");
+}
+| SHOW
+ {
+ $$ = mm_strdup("show");
+}
+| SIMPLE
+ {
+ $$ = mm_strdup("simple");
+}
+| SKIP
+ {
+ $$ = mm_strdup("skip");
+}
+| SNAPSHOT
+ {
+ $$ = mm_strdup("snapshot");
+}
+| SQL_P
+ {
+ $$ = mm_strdup("sql");
+}
+| STABLE
+ {
+ $$ = mm_strdup("stable");
+}
+| STANDALONE_P
+ {
+ $$ = mm_strdup("standalone");
+}
+| START
+ {
+ $$ = mm_strdup("start");
+}
+| STATEMENT
+ {
+ $$ = mm_strdup("statement");
+}
+| STATISTICS
+ {
+ $$ = mm_strdup("statistics");
+}
+| STDIN
+ {
+ $$ = mm_strdup("stdin");
+}
+| STDOUT
+ {
+ $$ = mm_strdup("stdout");
+}
+| STORAGE
+ {
+ $$ = mm_strdup("storage");
+}
+| STORED
+ {
+ $$ = mm_strdup("stored");
+}
+| STRICT_P
+ {
+ $$ = mm_strdup("strict");
+}
+| STRIP_P
+ {
+ $$ = mm_strdup("strip");
+}
+| SUBSCRIPTION
+ {
+ $$ = mm_strdup("subscription");
+}
+| SUPPORT
+ {
+ $$ = mm_strdup("support");
+}
+| SYSID
+ {
+ $$ = mm_strdup("sysid");
+}
+| SYSTEM_P
+ {
+ $$ = mm_strdup("system");
+}
+| TABLES
+ {
+ $$ = mm_strdup("tables");
+}
+| TABLESPACE
+ {
+ $$ = mm_strdup("tablespace");
+}
+| TEMP
+ {
+ $$ = mm_strdup("temp");
+}
+| TEMPLATE
+ {
+ $$ = mm_strdup("template");
+}
+| TEMPORARY
+ {
+ $$ = mm_strdup("temporary");
+}
+| TEXT_P
+ {
+ $$ = mm_strdup("text");
+}
+| TIES
+ {
+ $$ = mm_strdup("ties");
+}
+| TRANSACTION
+ {
+ $$ = mm_strdup("transaction");
+}
+| TRANSFORM
+ {
+ $$ = mm_strdup("transform");
+}
+| TRIGGER
+ {
+ $$ = mm_strdup("trigger");
+}
+| TRUNCATE
+ {
+ $$ = mm_strdup("truncate");
+}
+| TRUSTED
+ {
+ $$ = mm_strdup("trusted");
+}
+| TYPE_P
+ {
+ $$ = mm_strdup("type");
+}
+| TYPES_P
+ {
+ $$ = mm_strdup("types");
+}
+| UESCAPE
+ {
+ $$ = mm_strdup("uescape");
+}
+| UNBOUNDED
+ {
+ $$ = mm_strdup("unbounded");
+}
+| UNCOMMITTED
+ {
+ $$ = mm_strdup("uncommitted");
+}
+| UNENCRYPTED
+ {
+ $$ = mm_strdup("unencrypted");
+}
+| UNKNOWN
+ {
+ $$ = mm_strdup("unknown");
+}
+| UNLISTEN
+ {
+ $$ = mm_strdup("unlisten");
+}
+| UNLOGGED
+ {
+ $$ = mm_strdup("unlogged");
+}
+| UNTIL
+ {
+ $$ = mm_strdup("until");
+}
+| UPDATE
+ {
+ $$ = mm_strdup("update");
+}
+| VACUUM
+ {
+ $$ = mm_strdup("vacuum");
+}
+| VALID
+ {
+ $$ = mm_strdup("valid");
+}
+| VALIDATE
+ {
+ $$ = mm_strdup("validate");
+}
+| VALIDATOR
+ {
+ $$ = mm_strdup("validator");
+}
+| VALUE_P
+ {
+ $$ = mm_strdup("value");
+}
+| VARYING
+ {
+ $$ = mm_strdup("varying");
+}
+| VERSION_P
+ {
+ $$ = mm_strdup("version");
+}
+| VIEW
+ {
+ $$ = mm_strdup("view");
+}
+| VIEWS
+ {
+ $$ = mm_strdup("views");
+}
+| VOLATILE
+ {
+ $$ = mm_strdup("volatile");
+}
+| WHITESPACE_P
+ {
+ $$ = mm_strdup("whitespace");
+}
+| WITHIN
+ {
+ $$ = mm_strdup("within");
+}
+| WITHOUT
+ {
+ $$ = mm_strdup("without");
+}
+| WORK
+ {
+ $$ = mm_strdup("work");
+}
+| WRAPPER
+ {
+ $$ = mm_strdup("wrapper");
+}
+| WRITE
+ {
+ $$ = mm_strdup("write");
+}
+| XML_P
+ {
+ $$ = mm_strdup("xml");
+}
+| YES_P
+ {
+ $$ = mm_strdup("yes");
+}
+| ZONE
+ {
+ $$ = mm_strdup("zone");
+}
+;
+
+
+ col_name_keyword:
+ BETWEEN
+ {
+ $$ = mm_strdup("between");
+}
+| BIGINT
+ {
+ $$ = mm_strdup("bigint");
+}
+| BIT
+ {
+ $$ = mm_strdup("bit");
+}
+| BOOLEAN_P
+ {
+ $$ = mm_strdup("boolean");
+}
+| CHARACTER
+ {
+ $$ = mm_strdup("character");
+}
+| COALESCE
+ {
+ $$ = mm_strdup("coalesce");
+}
+| DEC
+ {
+ $$ = mm_strdup("dec");
+}
+| DECIMAL_P
+ {
+ $$ = mm_strdup("decimal");
+}
+| EXISTS
+ {
+ $$ = mm_strdup("exists");
+}
+| EXTRACT
+ {
+ $$ = mm_strdup("extract");
+}
+| FLOAT_P
+ {
+ $$ = mm_strdup("float");
+}
+| GREATEST
+ {
+ $$ = mm_strdup("greatest");
+}
+| GROUPING
+ {
+ $$ = mm_strdup("grouping");
+}
+| INOUT
+ {
+ $$ = mm_strdup("inout");
+}
+| INTEGER
+ {
+ $$ = mm_strdup("integer");
+}
+| INTERVAL
+ {
+ $$ = mm_strdup("interval");
+}
+| LEAST
+ {
+ $$ = mm_strdup("least");
+}
+| NATIONAL
+ {
+ $$ = mm_strdup("national");
+}
+| NCHAR
+ {
+ $$ = mm_strdup("nchar");
+}
+| NONE
+ {
+ $$ = mm_strdup("none");
+}
+| NORMALIZE
+ {
+ $$ = mm_strdup("normalize");
+}
+| NULLIF
+ {
+ $$ = mm_strdup("nullif");
+}
+| NUMERIC
+ {
+ $$ = mm_strdup("numeric");
+}
+| OUT_P
+ {
+ $$ = mm_strdup("out");
+}
+| OVERLAY
+ {
+ $$ = mm_strdup("overlay");
+}
+| POSITION
+ {
+ $$ = mm_strdup("position");
+}
+| PRECISION
+ {
+ $$ = mm_strdup("precision");
+}
+| REAL
+ {
+ $$ = mm_strdup("real");
+}
+| ROW
+ {
+ $$ = mm_strdup("row");
+}
+| SETOF
+ {
+ $$ = mm_strdup("setof");
+}
+| SMALLINT
+ {
+ $$ = mm_strdup("smallint");
+}
+| SUBSTRING
+ {
+ $$ = mm_strdup("substring");
+}
+| TIME
+ {
+ $$ = mm_strdup("time");
+}
+| TIMESTAMP
+ {
+ $$ = mm_strdup("timestamp");
+}
+| TREAT
+ {
+ $$ = mm_strdup("treat");
+}
+| TRIM
+ {
+ $$ = mm_strdup("trim");
+}
+| VARCHAR
+ {
+ $$ = mm_strdup("varchar");
+}
+| XMLATTRIBUTES
+ {
+ $$ = mm_strdup("xmlattributes");
+}
+| XMLCONCAT
+ {
+ $$ = mm_strdup("xmlconcat");
+}
+| XMLELEMENT
+ {
+ $$ = mm_strdup("xmlelement");
+}
+| XMLEXISTS
+ {
+ $$ = mm_strdup("xmlexists");
+}
+| XMLFOREST
+ {
+ $$ = mm_strdup("xmlforest");
+}
+| XMLNAMESPACES
+ {
+ $$ = mm_strdup("xmlnamespaces");
+}
+| XMLPARSE
+ {
+ $$ = mm_strdup("xmlparse");
+}
+| XMLPI
+ {
+ $$ = mm_strdup("xmlpi");
+}
+| XMLROOT
+ {
+ $$ = mm_strdup("xmlroot");
+}
+| XMLSERIALIZE
+ {
+ $$ = mm_strdup("xmlserialize");
+}
+| XMLTABLE
+ {
+ $$ = mm_strdup("xmltable");
+}
+;
+
+
+ type_func_name_keyword:
+ AUTHORIZATION
+ {
+ $$ = mm_strdup("authorization");
+}
+| BINARY
+ {
+ $$ = mm_strdup("binary");
+}
+| COLLATION
+ {
+ $$ = mm_strdup("collation");
+}
+| CONCURRENTLY
+ {
+ $$ = mm_strdup("concurrently");
+}
+| CROSS
+ {
+ $$ = mm_strdup("cross");
+}
+| CURRENT_SCHEMA
+ {
+ $$ = mm_strdup("current_schema");
+}
+| FREEZE
+ {
+ $$ = mm_strdup("freeze");
+}
+| FULL
+ {
+ $$ = mm_strdup("full");
+}
+| ILIKE
+ {
+ $$ = mm_strdup("ilike");
+}
+| INNER_P
+ {
+ $$ = mm_strdup("inner");
+}
+| IS
+ {
+ $$ = mm_strdup("is");
+}
+| ISNULL
+ {
+ $$ = mm_strdup("isnull");
+}
+| JOIN
+ {
+ $$ = mm_strdup("join");
+}
+| LEFT
+ {
+ $$ = mm_strdup("left");
+}
+| LIKE
+ {
+ $$ = mm_strdup("like");
+}
+| NATURAL
+ {
+ $$ = mm_strdup("natural");
+}
+| NOTNULL
+ {
+ $$ = mm_strdup("notnull");
+}
+| OUTER_P
+ {
+ $$ = mm_strdup("outer");
+}
+| OVERLAPS
+ {
+ $$ = mm_strdup("overlaps");
+}
+| RIGHT
+ {
+ $$ = mm_strdup("right");
+}
+| SIMILAR
+ {
+ $$ = mm_strdup("similar");
+}
+| TABLESAMPLE
+ {
+ $$ = mm_strdup("tablesample");
+}
+| VERBOSE
+ {
+ $$ = mm_strdup("verbose");
+}
+;
+
+
+ reserved_keyword:
+ ALL
+ {
+ $$ = mm_strdup("all");
+}
+| ANALYSE
+ {
+ $$ = mm_strdup("analyse");
+}
+| ANALYZE
+ {
+ $$ = mm_strdup("analyze");
+}
+| AND
+ {
+ $$ = mm_strdup("and");
+}
+| ANY
+ {
+ $$ = mm_strdup("any");
+}
+| ARRAY
+ {
+ $$ = mm_strdup("array");
+}
+| AS
+ {
+ $$ = mm_strdup("as");
+}
+| ASC
+ {
+ $$ = mm_strdup("asc");
+}
+| ASYMMETRIC
+ {
+ $$ = mm_strdup("asymmetric");
+}
+| BOTH
+ {
+ $$ = mm_strdup("both");
+}
+| CASE
+ {
+ $$ = mm_strdup("case");
+}
+| CAST
+ {
+ $$ = mm_strdup("cast");
+}
+| CHECK
+ {
+ $$ = mm_strdup("check");
+}
+| COLLATE
+ {
+ $$ = mm_strdup("collate");
+}
+| COLUMN
+ {
+ $$ = mm_strdup("column");
+}
+| CONSTRAINT
+ {
+ $$ = mm_strdup("constraint");
+}
+| CREATE
+ {
+ $$ = mm_strdup("create");
+}
+| CURRENT_CATALOG
+ {
+ $$ = mm_strdup("current_catalog");
+}
+| CURRENT_DATE
+ {
+ $$ = mm_strdup("current_date");
+}
+| CURRENT_ROLE
+ {
+ $$ = mm_strdup("current_role");
+}
+| CURRENT_TIME
+ {
+ $$ = mm_strdup("current_time");
+}
+| CURRENT_TIMESTAMP
+ {
+ $$ = mm_strdup("current_timestamp");
+}
+| CURRENT_USER
+ {
+ $$ = mm_strdup("current_user");
+}
+| DEFAULT
+ {
+ $$ = mm_strdup("default");
+}
+| DEFERRABLE
+ {
+ $$ = mm_strdup("deferrable");
+}
+| DESC
+ {
+ $$ = mm_strdup("desc");
+}
+| DISTINCT
+ {
+ $$ = mm_strdup("distinct");
+}
+| DO
+ {
+ $$ = mm_strdup("do");
+}
+| ELSE
+ {
+ $$ = mm_strdup("else");
+}
+| END_P
+ {
+ $$ = mm_strdup("end");
+}
+| EXCEPT
+ {
+ $$ = mm_strdup("except");
+}
+| FALSE_P
+ {
+ $$ = mm_strdup("false");
+}
+| FETCH
+ {
+ $$ = mm_strdup("fetch");
+}
+| FOR
+ {
+ $$ = mm_strdup("for");
+}
+| FOREIGN
+ {
+ $$ = mm_strdup("foreign");
+}
+| FROM
+ {
+ $$ = mm_strdup("from");
+}
+| GRANT
+ {
+ $$ = mm_strdup("grant");
+}
+| GROUP_P
+ {
+ $$ = mm_strdup("group");
+}
+| HAVING
+ {
+ $$ = mm_strdup("having");
+}
+| IN_P
+ {
+ $$ = mm_strdup("in");
+}
+| INITIALLY
+ {
+ $$ = mm_strdup("initially");
+}
+| INTERSECT
+ {
+ $$ = mm_strdup("intersect");
+}
+| INTO
+ {
+ $$ = mm_strdup("into");
+}
+| LATERAL_P
+ {
+ $$ = mm_strdup("lateral");
+}
+| LEADING
+ {
+ $$ = mm_strdup("leading");
+}
+| LIMIT
+ {
+ $$ = mm_strdup("limit");
+}
+| LOCALTIME
+ {
+ $$ = mm_strdup("localtime");
+}
+| LOCALTIMESTAMP
+ {
+ $$ = mm_strdup("localtimestamp");
+}
+| NOT
+ {
+ $$ = mm_strdup("not");
+}
+| NULL_P
+ {
+ $$ = mm_strdup("null");
+}
+| OFFSET
+ {
+ $$ = mm_strdup("offset");
+}
+| ON
+ {
+ $$ = mm_strdup("on");
+}
+| ONLY
+ {
+ $$ = mm_strdup("only");
+}
+| OR
+ {
+ $$ = mm_strdup("or");
+}
+| ORDER
+ {
+ $$ = mm_strdup("order");
+}
+| PLACING
+ {
+ $$ = mm_strdup("placing");
+}
+| PRIMARY
+ {
+ $$ = mm_strdup("primary");
+}
+| REFERENCES
+ {
+ $$ = mm_strdup("references");
+}
+| RETURNING
+ {
+ $$ = mm_strdup("returning");
+}
+| SELECT
+ {
+ $$ = mm_strdup("select");
+}
+| SESSION_USER
+ {
+ $$ = mm_strdup("session_user");
+}
+| SOME
+ {
+ $$ = mm_strdup("some");
+}
+| SYMMETRIC
+ {
+ $$ = mm_strdup("symmetric");
+}
+| TABLE
+ {
+ $$ = mm_strdup("table");
+}
+| THEN
+ {
+ $$ = mm_strdup("then");
+}
+| TRAILING
+ {
+ $$ = mm_strdup("trailing");
+}
+| TRUE_P
+ {
+ $$ = mm_strdup("true");
+}
+| UNIQUE
+ {
+ $$ = mm_strdup("unique");
+}
+| USER
+ {
+ $$ = mm_strdup("user");
+}
+| USING
+ {
+ $$ = mm_strdup("using");
+}
+| VARIADIC
+ {
+ $$ = mm_strdup("variadic");
+}
+| WHEN
+ {
+ $$ = mm_strdup("when");
+}
+| WHERE
+ {
+ $$ = mm_strdup("where");
+}
+| WINDOW
+ {
+ $$ = mm_strdup("window");
+}
+| WITH
+ {
+ $$ = mm_strdup("with");
+}
+;
+
+
+ bare_label_keyword:
+ ABORT_P
+ {
+ $$ = mm_strdup("abort");
+}
+| ABSOLUTE_P
+ {
+ $$ = mm_strdup("absolute");
+}
+| ACCESS
+ {
+ $$ = mm_strdup("access");
+}
+| ACTION
+ {
+ $$ = mm_strdup("action");
+}
+| ADD_P
+ {
+ $$ = mm_strdup("add");
+}
+| ADMIN
+ {
+ $$ = mm_strdup("admin");
+}
+| AFTER
+ {
+ $$ = mm_strdup("after");
+}
+| AGGREGATE
+ {
+ $$ = mm_strdup("aggregate");
+}
+| ALL
+ {
+ $$ = mm_strdup("all");
+}
+| ALSO
+ {
+ $$ = mm_strdup("also");
+}
+| ALTER
+ {
+ $$ = mm_strdup("alter");
+}
+| ALWAYS
+ {
+ $$ = mm_strdup("always");
+}
+| ANALYSE
+ {
+ $$ = mm_strdup("analyse");
+}
+| ANALYZE
+ {
+ $$ = mm_strdup("analyze");
+}
+| AND
+ {
+ $$ = mm_strdup("and");
+}
+| ANY
+ {
+ $$ = mm_strdup("any");
+}
+| ASC
+ {
+ $$ = mm_strdup("asc");
+}
+| ASENSITIVE
+ {
+ $$ = mm_strdup("asensitive");
+}
+| ASSERTION
+ {
+ $$ = mm_strdup("assertion");
+}
+| ASSIGNMENT
+ {
+ $$ = mm_strdup("assignment");
+}
+| ASYMMETRIC
+ {
+ $$ = mm_strdup("asymmetric");
+}
+| AT
+ {
+ $$ = mm_strdup("at");
+}
+| ATOMIC
+ {
+ $$ = mm_strdup("atomic");
+}
+| ATTACH
+ {
+ $$ = mm_strdup("attach");
+}
+| ATTRIBUTE
+ {
+ $$ = mm_strdup("attribute");
+}
+| AUTHORIZATION
+ {
+ $$ = mm_strdup("authorization");
+}
+| BACKWARD
+ {
+ $$ = mm_strdup("backward");
+}
+| BEFORE
+ {
+ $$ = mm_strdup("before");
+}
+| BEGIN_P
+ {
+ $$ = mm_strdup("begin");
+}
+| BETWEEN
+ {
+ $$ = mm_strdup("between");
+}
+| BIGINT
+ {
+ $$ = mm_strdup("bigint");
+}
+| BINARY
+ {
+ $$ = mm_strdup("binary");
+}
+| BIT
+ {
+ $$ = mm_strdup("bit");
+}
+| BOOLEAN_P
+ {
+ $$ = mm_strdup("boolean");
+}
+| BOTH
+ {
+ $$ = mm_strdup("both");
+}
+| BREADTH
+ {
+ $$ = mm_strdup("breadth");
+}
+| BY
+ {
+ $$ = mm_strdup("by");
+}
+| CACHE
+ {
+ $$ = mm_strdup("cache");
+}
+| CALL
+ {
+ $$ = mm_strdup("call");
+}
+| CALLED
+ {
+ $$ = mm_strdup("called");
+}
+| CASCADE
+ {
+ $$ = mm_strdup("cascade");
+}
+| CASCADED
+ {
+ $$ = mm_strdup("cascaded");
+}
+| CASE
+ {
+ $$ = mm_strdup("case");
+}
+| CAST
+ {
+ $$ = mm_strdup("cast");
+}
+| CATALOG_P
+ {
+ $$ = mm_strdup("catalog");
+}
+| CHAIN
+ {
+ $$ = mm_strdup("chain");
+}
+| CHARACTERISTICS
+ {
+ $$ = mm_strdup("characteristics");
+}
+| CHECK
+ {
+ $$ = mm_strdup("check");
+}
+| CHECKPOINT
+ {
+ $$ = mm_strdup("checkpoint");
+}
+| CLASS
+ {
+ $$ = mm_strdup("class");
+}
+| CLOSE
+ {
+ $$ = mm_strdup("close");
+}
+| CLUSTER
+ {
+ $$ = mm_strdup("cluster");
+}
+| COALESCE
+ {
+ $$ = mm_strdup("coalesce");
+}
+| COLLATE
+ {
+ $$ = mm_strdup("collate");
+}
+| COLLATION
+ {
+ $$ = mm_strdup("collation");
+}
+| COLUMN
+ {
+ $$ = mm_strdup("column");
+}
+| COLUMNS
+ {
+ $$ = mm_strdup("columns");
+}
+| COMMENT
+ {
+ $$ = mm_strdup("comment");
+}
+| COMMENTS
+ {
+ $$ = mm_strdup("comments");
+}
+| COMMIT
+ {
+ $$ = mm_strdup("commit");
+}
+| COMMITTED
+ {
+ $$ = mm_strdup("committed");
+}
+| COMPRESSION
+ {
+ $$ = mm_strdup("compression");
+}
+| CONCURRENTLY
+ {
+ $$ = mm_strdup("concurrently");
+}
+| CONFIGURATION
+ {
+ $$ = mm_strdup("configuration");
+}
+| CONFLICT
+ {
+ $$ = mm_strdup("conflict");
+}
+| CONNECTION
+ {
+ $$ = mm_strdup("connection");
+}
+| CONSTRAINT
+ {
+ $$ = mm_strdup("constraint");
+}
+| CONSTRAINTS
+ {
+ $$ = mm_strdup("constraints");
+}
+| CONTENT_P
+ {
+ $$ = mm_strdup("content");
+}
+| CONTINUE_P
+ {
+ $$ = mm_strdup("continue");
+}
+| CONVERSION_P
+ {
+ $$ = mm_strdup("conversion");
+}
+| COPY
+ {
+ $$ = mm_strdup("copy");
+}
+| COST
+ {
+ $$ = mm_strdup("cost");
+}
+| CROSS
+ {
+ $$ = mm_strdup("cross");
+}
+| CSV
+ {
+ $$ = mm_strdup("csv");
+}
+| CUBE
+ {
+ $$ = mm_strdup("cube");
+}
+| CURRENT_P
+ {
+ $$ = mm_strdup("current");
+}
+| CURRENT_CATALOG
+ {
+ $$ = mm_strdup("current_catalog");
+}
+| CURRENT_DATE
+ {
+ $$ = mm_strdup("current_date");
+}
+| CURRENT_ROLE
+ {
+ $$ = mm_strdup("current_role");
+}
+| CURRENT_SCHEMA
+ {
+ $$ = mm_strdup("current_schema");
+}
+| CURRENT_TIME
+ {
+ $$ = mm_strdup("current_time");
+}
+| CURRENT_TIMESTAMP
+ {
+ $$ = mm_strdup("current_timestamp");
+}
+| CURRENT_USER
+ {
+ $$ = mm_strdup("current_user");
+}
+| CURSOR
+ {
+ $$ = mm_strdup("cursor");
+}
+| CYCLE
+ {
+ $$ = mm_strdup("cycle");
+}
+| DATA_P
+ {
+ $$ = mm_strdup("data");
+}
+| DATABASE
+ {
+ $$ = mm_strdup("database");
+}
+| DEALLOCATE
+ {
+ $$ = mm_strdup("deallocate");
+}
+| DEC
+ {
+ $$ = mm_strdup("dec");
+}
+| DECIMAL_P
+ {
+ $$ = mm_strdup("decimal");
+}
+| DECLARE
+ {
+ $$ = mm_strdup("declare");
+}
+| DEFAULT
+ {
+ $$ = mm_strdup("default");
+}
+| DEFAULTS
+ {
+ $$ = mm_strdup("defaults");
+}
+| DEFERRABLE
+ {
+ $$ = mm_strdup("deferrable");
+}
+| DEFERRED
+ {
+ $$ = mm_strdup("deferred");
+}
+| DEFINER
+ {
+ $$ = mm_strdup("definer");
+}
+| DELETE_P
+ {
+ $$ = mm_strdup("delete");
+}
+| DELIMITER
+ {
+ $$ = mm_strdup("delimiter");
+}
+| DELIMITERS
+ {
+ $$ = mm_strdup("delimiters");
+}
+| DEPENDS
+ {
+ $$ = mm_strdup("depends");
+}
+| DEPTH
+ {
+ $$ = mm_strdup("depth");
+}
+| DESC
+ {
+ $$ = mm_strdup("desc");
+}
+| DETACH
+ {
+ $$ = mm_strdup("detach");
+}
+| DICTIONARY
+ {
+ $$ = mm_strdup("dictionary");
+}
+| DISABLE_P
+ {
+ $$ = mm_strdup("disable");
+}
+| DISCARD
+ {
+ $$ = mm_strdup("discard");
+}
+| DISTINCT
+ {
+ $$ = mm_strdup("distinct");
+}
+| DO
+ {
+ $$ = mm_strdup("do");
+}
+| DOCUMENT_P
+ {
+ $$ = mm_strdup("document");
+}
+| DOMAIN_P
+ {
+ $$ = mm_strdup("domain");
+}
+| DOUBLE_P
+ {
+ $$ = mm_strdup("double");
+}
+| DROP
+ {
+ $$ = mm_strdup("drop");
+}
+| EACH
+ {
+ $$ = mm_strdup("each");
+}
+| ELSE
+ {
+ $$ = mm_strdup("else");
+}
+| ENABLE_P
+ {
+ $$ = mm_strdup("enable");
+}
+| ENCODING
+ {
+ $$ = mm_strdup("encoding");
+}
+| ENCRYPTED
+ {
+ $$ = mm_strdup("encrypted");
+}
+| END_P
+ {
+ $$ = mm_strdup("end");
+}
+| ENUM_P
+ {
+ $$ = mm_strdup("enum");
+}
+| ESCAPE
+ {
+ $$ = mm_strdup("escape");
+}
+| EVENT
+ {
+ $$ = mm_strdup("event");
+}
+| EXCLUDE
+ {
+ $$ = mm_strdup("exclude");
+}
+| EXCLUDING
+ {
+ $$ = mm_strdup("excluding");
+}
+| EXCLUSIVE
+ {
+ $$ = mm_strdup("exclusive");
+}
+| EXECUTE
+ {
+ $$ = mm_strdup("execute");
+}
+| EXISTS
+ {
+ $$ = mm_strdup("exists");
+}
+| EXPLAIN
+ {
+ $$ = mm_strdup("explain");
+}
+| EXPRESSION
+ {
+ $$ = mm_strdup("expression");
+}
+| EXTENSION
+ {
+ $$ = mm_strdup("extension");
+}
+| EXTERNAL
+ {
+ $$ = mm_strdup("external");
+}
+| EXTRACT
+ {
+ $$ = mm_strdup("extract");
+}
+| FALSE_P
+ {
+ $$ = mm_strdup("false");
+}
+| FAMILY
+ {
+ $$ = mm_strdup("family");
+}
+| FINALIZE
+ {
+ $$ = mm_strdup("finalize");
+}
+| FIRST_P
+ {
+ $$ = mm_strdup("first");
+}
+| FLOAT_P
+ {
+ $$ = mm_strdup("float");
+}
+| FOLLOWING
+ {
+ $$ = mm_strdup("following");
+}
+| FORCE
+ {
+ $$ = mm_strdup("force");
+}
+| FOREIGN
+ {
+ $$ = mm_strdup("foreign");
+}
+| FORWARD
+ {
+ $$ = mm_strdup("forward");
+}
+| FREEZE
+ {
+ $$ = mm_strdup("freeze");
+}
+| FULL
+ {
+ $$ = mm_strdup("full");
+}
+| FUNCTION
+ {
+ $$ = mm_strdup("function");
+}
+| FUNCTIONS
+ {
+ $$ = mm_strdup("functions");
+}
+| GENERATED
+ {
+ $$ = mm_strdup("generated");
+}
+| GLOBAL
+ {
+ $$ = mm_strdup("global");
+}
+| GRANTED
+ {
+ $$ = mm_strdup("granted");
+}
+| GREATEST
+ {
+ $$ = mm_strdup("greatest");
+}
+| GROUPING
+ {
+ $$ = mm_strdup("grouping");
+}
+| GROUPS
+ {
+ $$ = mm_strdup("groups");
+}
+| HANDLER
+ {
+ $$ = mm_strdup("handler");
+}
+| HEADER_P
+ {
+ $$ = mm_strdup("header");
+}
+| HOLD
+ {
+ $$ = mm_strdup("hold");
+}
+| IDENTITY_P
+ {
+ $$ = mm_strdup("identity");
+}
+| IF_P
+ {
+ $$ = mm_strdup("if");
+}
+| ILIKE
+ {
+ $$ = mm_strdup("ilike");
+}
+| IMMEDIATE
+ {
+ $$ = mm_strdup("immediate");
+}
+| IMMUTABLE
+ {
+ $$ = mm_strdup("immutable");
+}
+| IMPLICIT_P
+ {
+ $$ = mm_strdup("implicit");
+}
+| IMPORT_P
+ {
+ $$ = mm_strdup("import");
+}
+| IN_P
+ {
+ $$ = mm_strdup("in");
+}
+| INCLUDE
+ {
+ $$ = mm_strdup("include");
+}
+| INCLUDING
+ {
+ $$ = mm_strdup("including");
+}
+| INCREMENT
+ {
+ $$ = mm_strdup("increment");
+}
+| INDEX
+ {
+ $$ = mm_strdup("index");
+}
+| INDEXES
+ {
+ $$ = mm_strdup("indexes");
+}
+| INHERIT
+ {
+ $$ = mm_strdup("inherit");
+}
+| INHERITS
+ {
+ $$ = mm_strdup("inherits");
+}
+| INITIALLY
+ {
+ $$ = mm_strdup("initially");
+}
+| INLINE_P
+ {
+ $$ = mm_strdup("inline");
+}
+| INNER_P
+ {
+ $$ = mm_strdup("inner");
+}
+| INOUT
+ {
+ $$ = mm_strdup("inout");
+}
+| INPUT_P
+ {
+ $$ = mm_strdup("input");
+}
+| INSENSITIVE
+ {
+ $$ = mm_strdup("insensitive");
+}
+| INSERT
+ {
+ $$ = mm_strdup("insert");
+}
+| INSTEAD
+ {
+ $$ = mm_strdup("instead");
+}
+| INT_P
+ {
+ $$ = mm_strdup("int");
+}
+| INTEGER
+ {
+ $$ = mm_strdup("integer");
+}
+| INTERVAL
+ {
+ $$ = mm_strdup("interval");
+}
+| INVOKER
+ {
+ $$ = mm_strdup("invoker");
+}
+| IS
+ {
+ $$ = mm_strdup("is");
+}
+| ISOLATION
+ {
+ $$ = mm_strdup("isolation");
+}
+| JOIN
+ {
+ $$ = mm_strdup("join");
+}
+| KEY
+ {
+ $$ = mm_strdup("key");
+}
+| LABEL
+ {
+ $$ = mm_strdup("label");
+}
+| LANGUAGE
+ {
+ $$ = mm_strdup("language");
+}
+| LARGE_P
+ {
+ $$ = mm_strdup("large");
+}
+| LAST_P
+ {
+ $$ = mm_strdup("last");
+}
+| LATERAL_P
+ {
+ $$ = mm_strdup("lateral");
+}
+| LEADING
+ {
+ $$ = mm_strdup("leading");
+}
+| LEAKPROOF
+ {
+ $$ = mm_strdup("leakproof");
+}
+| LEAST
+ {
+ $$ = mm_strdup("least");
+}
+| LEFT
+ {
+ $$ = mm_strdup("left");
+}
+| LEVEL
+ {
+ $$ = mm_strdup("level");
+}
+| LIKE
+ {
+ $$ = mm_strdup("like");
+}
+| LISTEN
+ {
+ $$ = mm_strdup("listen");
+}
+| LOAD
+ {
+ $$ = mm_strdup("load");
+}
+| LOCAL
+ {
+ $$ = mm_strdup("local");
+}
+| LOCALTIME
+ {
+ $$ = mm_strdup("localtime");
+}
+| LOCALTIMESTAMP
+ {
+ $$ = mm_strdup("localtimestamp");
+}
+| LOCATION
+ {
+ $$ = mm_strdup("location");
+}
+| LOCK_P
+ {
+ $$ = mm_strdup("lock");
+}
+| LOCKED
+ {
+ $$ = mm_strdup("locked");
+}
+| LOGGED
+ {
+ $$ = mm_strdup("logged");
+}
+| MAPPING
+ {
+ $$ = mm_strdup("mapping");
+}
+| MATCH
+ {
+ $$ = mm_strdup("match");
+}
+| MATERIALIZED
+ {
+ $$ = mm_strdup("materialized");
+}
+| MAXVALUE
+ {
+ $$ = mm_strdup("maxvalue");
+}
+| METHOD
+ {
+ $$ = mm_strdup("method");
+}
+| MINVALUE
+ {
+ $$ = mm_strdup("minvalue");
+}
+| MODE
+ {
+ $$ = mm_strdup("mode");
+}
+| MOVE
+ {
+ $$ = mm_strdup("move");
+}
+| NAME_P
+ {
+ $$ = mm_strdup("name");
+}
+| NAMES
+ {
+ $$ = mm_strdup("names");
+}
+| NATIONAL
+ {
+ $$ = mm_strdup("national");
+}
+| NATURAL
+ {
+ $$ = mm_strdup("natural");
+}
+| NCHAR
+ {
+ $$ = mm_strdup("nchar");
+}
+| NEW
+ {
+ $$ = mm_strdup("new");
+}
+| NEXT
+ {
+ $$ = mm_strdup("next");
+}
+| NFC
+ {
+ $$ = mm_strdup("nfc");
+}
+| NFD
+ {
+ $$ = mm_strdup("nfd");
+}
+| NFKC
+ {
+ $$ = mm_strdup("nfkc");
+}
+| NFKD
+ {
+ $$ = mm_strdup("nfkd");
+}
+| NO
+ {
+ $$ = mm_strdup("no");
+}
+| NONE
+ {
+ $$ = mm_strdup("none");
+}
+| NORMALIZE
+ {
+ $$ = mm_strdup("normalize");
+}
+| NORMALIZED
+ {
+ $$ = mm_strdup("normalized");
+}
+| NOT
+ {
+ $$ = mm_strdup("not");
+}
+| NOTHING
+ {
+ $$ = mm_strdup("nothing");
+}
+| NOTIFY
+ {
+ $$ = mm_strdup("notify");
+}
+| NOWAIT
+ {
+ $$ = mm_strdup("nowait");
+}
+| NULL_P
+ {
+ $$ = mm_strdup("null");
+}
+| NULLIF
+ {
+ $$ = mm_strdup("nullif");
+}
+| NULLS_P
+ {
+ $$ = mm_strdup("nulls");
+}
+| NUMERIC
+ {
+ $$ = mm_strdup("numeric");
+}
+| OBJECT_P
+ {
+ $$ = mm_strdup("object");
+}
+| OF
+ {
+ $$ = mm_strdup("of");
+}
+| OFF
+ {
+ $$ = mm_strdup("off");
+}
+| OIDS
+ {
+ $$ = mm_strdup("oids");
+}
+| OLD
+ {
+ $$ = mm_strdup("old");
+}
+| ONLY
+ {
+ $$ = mm_strdup("only");
+}
+| OPERATOR
+ {
+ $$ = mm_strdup("operator");
+}
+| OPTION
+ {
+ $$ = mm_strdup("option");
+}
+| OPTIONS
+ {
+ $$ = mm_strdup("options");
+}
+| OR
+ {
+ $$ = mm_strdup("or");
+}
+| ORDINALITY
+ {
+ $$ = mm_strdup("ordinality");
+}
+| OTHERS
+ {
+ $$ = mm_strdup("others");
+}
+| OUT_P
+ {
+ $$ = mm_strdup("out");
+}
+| OUTER_P
+ {
+ $$ = mm_strdup("outer");
+}
+| OVERLAY
+ {
+ $$ = mm_strdup("overlay");
+}
+| OVERRIDING
+ {
+ $$ = mm_strdup("overriding");
+}
+| OWNED
+ {
+ $$ = mm_strdup("owned");
+}
+| OWNER
+ {
+ $$ = mm_strdup("owner");
+}
+| PARALLEL
+ {
+ $$ = mm_strdup("parallel");
+}
+| PARSER
+ {
+ $$ = mm_strdup("parser");
+}
+| PARTIAL
+ {
+ $$ = mm_strdup("partial");
+}
+| PARTITION
+ {
+ $$ = mm_strdup("partition");
+}
+| PASSING
+ {
+ $$ = mm_strdup("passing");
+}
+| PASSWORD
+ {
+ $$ = mm_strdup("password");
+}
+| PLACING
+ {
+ $$ = mm_strdup("placing");
+}
+| PLANS
+ {
+ $$ = mm_strdup("plans");
+}
+| POLICY
+ {
+ $$ = mm_strdup("policy");
+}
+| POSITION
+ {
+ $$ = mm_strdup("position");
+}
+| PRECEDING
+ {
+ $$ = mm_strdup("preceding");
+}
+| PREPARE
+ {
+ $$ = mm_strdup("prepare");
+}
+| PREPARED
+ {
+ $$ = mm_strdup("prepared");
+}
+| PRESERVE
+ {
+ $$ = mm_strdup("preserve");
+}
+| PRIMARY
+ {
+ $$ = mm_strdup("primary");
+}
+| PRIOR
+ {
+ $$ = mm_strdup("prior");
+}
+| PRIVILEGES
+ {
+ $$ = mm_strdup("privileges");
+}
+| PROCEDURAL
+ {
+ $$ = mm_strdup("procedural");
+}
+| PROCEDURE
+ {
+ $$ = mm_strdup("procedure");
+}
+| PROCEDURES
+ {
+ $$ = mm_strdup("procedures");
+}
+| PROGRAM
+ {
+ $$ = mm_strdup("program");
+}
+| PUBLICATION
+ {
+ $$ = mm_strdup("publication");
+}
+| QUOTE
+ {
+ $$ = mm_strdup("quote");
+}
+| RANGE
+ {
+ $$ = mm_strdup("range");
+}
+| READ
+ {
+ $$ = mm_strdup("read");
+}
+| REAL
+ {
+ $$ = mm_strdup("real");
+}
+| REASSIGN
+ {
+ $$ = mm_strdup("reassign");
+}
+| RECHECK
+ {
+ $$ = mm_strdup("recheck");
+}
+| RECURSIVE
+ {
+ $$ = mm_strdup("recursive");
+}
+| REF
+ {
+ $$ = mm_strdup("ref");
+}
+| REFERENCES
+ {
+ $$ = mm_strdup("references");
+}
+| REFERENCING
+ {
+ $$ = mm_strdup("referencing");
+}
+| REFRESH
+ {
+ $$ = mm_strdup("refresh");
+}
+| REINDEX
+ {
+ $$ = mm_strdup("reindex");
+}
+| RELATIVE_P
+ {
+ $$ = mm_strdup("relative");
+}
+| RELEASE
+ {
+ $$ = mm_strdup("release");
+}
+| RENAME
+ {
+ $$ = mm_strdup("rename");
+}
+| REPEATABLE
+ {
+ $$ = mm_strdup("repeatable");
+}
+| REPLACE
+ {
+ $$ = mm_strdup("replace");
+}
+| REPLICA
+ {
+ $$ = mm_strdup("replica");
+}
+| RESET
+ {
+ $$ = mm_strdup("reset");
+}
+| RESTART
+ {
+ $$ = mm_strdup("restart");
+}
+| RESTRICT
+ {
+ $$ = mm_strdup("restrict");
+}
+| RETURN
+ {
+ $$ = mm_strdup("return");
+}
+| RETURNS
+ {
+ $$ = mm_strdup("returns");
+}
+| REVOKE
+ {
+ $$ = mm_strdup("revoke");
+}
+| RIGHT
+ {
+ $$ = mm_strdup("right");
+}
+| ROLE
+ {
+ $$ = mm_strdup("role");
+}
+| ROLLBACK
+ {
+ $$ = mm_strdup("rollback");
+}
+| ROLLUP
+ {
+ $$ = mm_strdup("rollup");
+}
+| ROUTINE
+ {
+ $$ = mm_strdup("routine");
+}
+| ROUTINES
+ {
+ $$ = mm_strdup("routines");
+}
+| ROW
+ {
+ $$ = mm_strdup("row");
+}
+| ROWS
+ {
+ $$ = mm_strdup("rows");
+}
+| RULE
+ {
+ $$ = mm_strdup("rule");
+}
+| SAVEPOINT
+ {
+ $$ = mm_strdup("savepoint");
+}
+| SCHEMA
+ {
+ $$ = mm_strdup("schema");
+}
+| SCHEMAS
+ {
+ $$ = mm_strdup("schemas");
+}
+| SCROLL
+ {
+ $$ = mm_strdup("scroll");
+}
+| SEARCH
+ {
+ $$ = mm_strdup("search");
+}
+| SECURITY
+ {
+ $$ = mm_strdup("security");
+}
+| SELECT
+ {
+ $$ = mm_strdup("select");
+}
+| SEQUENCE
+ {
+ $$ = mm_strdup("sequence");
+}
+| SEQUENCES
+ {
+ $$ = mm_strdup("sequences");
+}
+| SERIALIZABLE
+ {
+ $$ = mm_strdup("serializable");
+}
+| SERVER
+ {
+ $$ = mm_strdup("server");
+}
+| SESSION
+ {
+ $$ = mm_strdup("session");
+}
+| SESSION_USER
+ {
+ $$ = mm_strdup("session_user");
+}
+| SET
+ {
+ $$ = mm_strdup("set");
+}
+| SETOF
+ {
+ $$ = mm_strdup("setof");
+}
+| SETS
+ {
+ $$ = mm_strdup("sets");
+}
+| SHARE
+ {
+ $$ = mm_strdup("share");
+}
+| SHOW
+ {
+ $$ = mm_strdup("show");
+}
+| SIMILAR
+ {
+ $$ = mm_strdup("similar");
+}
+| SIMPLE
+ {
+ $$ = mm_strdup("simple");
+}
+| SKIP
+ {
+ $$ = mm_strdup("skip");
+}
+| SMALLINT
+ {
+ $$ = mm_strdup("smallint");
+}
+| SNAPSHOT
+ {
+ $$ = mm_strdup("snapshot");
+}
+| SOME
+ {
+ $$ = mm_strdup("some");
+}
+| SQL_P
+ {
+ $$ = mm_strdup("sql");
+}
+| STABLE
+ {
+ $$ = mm_strdup("stable");
+}
+| STANDALONE_P
+ {
+ $$ = mm_strdup("standalone");
+}
+| START
+ {
+ $$ = mm_strdup("start");
+}
+| STATEMENT
+ {
+ $$ = mm_strdup("statement");
+}
+| STATISTICS
+ {
+ $$ = mm_strdup("statistics");
+}
+| STDIN
+ {
+ $$ = mm_strdup("stdin");
+}
+| STDOUT
+ {
+ $$ = mm_strdup("stdout");
+}
+| STORAGE
+ {
+ $$ = mm_strdup("storage");
+}
+| STORED
+ {
+ $$ = mm_strdup("stored");
+}
+| STRICT_P
+ {
+ $$ = mm_strdup("strict");
+}
+| STRIP_P
+ {
+ $$ = mm_strdup("strip");
+}
+| SUBSCRIPTION
+ {
+ $$ = mm_strdup("subscription");
+}
+| SUBSTRING
+ {
+ $$ = mm_strdup("substring");
+}
+| SUPPORT
+ {
+ $$ = mm_strdup("support");
+}
+| SYMMETRIC
+ {
+ $$ = mm_strdup("symmetric");
+}
+| SYSID
+ {
+ $$ = mm_strdup("sysid");
+}
+| SYSTEM_P
+ {
+ $$ = mm_strdup("system");
+}
+| TABLE
+ {
+ $$ = mm_strdup("table");
+}
+| TABLES
+ {
+ $$ = mm_strdup("tables");
+}
+| TABLESAMPLE
+ {
+ $$ = mm_strdup("tablesample");
+}
+| TABLESPACE
+ {
+ $$ = mm_strdup("tablespace");
+}
+| TEMP
+ {
+ $$ = mm_strdup("temp");
+}
+| TEMPLATE
+ {
+ $$ = mm_strdup("template");
+}
+| TEMPORARY
+ {
+ $$ = mm_strdup("temporary");
+}
+| TEXT_P
+ {
+ $$ = mm_strdup("text");
+}
+| THEN
+ {
+ $$ = mm_strdup("then");
+}
+| TIES
+ {
+ $$ = mm_strdup("ties");
+}
+| TIME
+ {
+ $$ = mm_strdup("time");
+}
+| TIMESTAMP
+ {
+ $$ = mm_strdup("timestamp");
+}
+| TRAILING
+ {
+ $$ = mm_strdup("trailing");
+}
+| TRANSACTION
+ {
+ $$ = mm_strdup("transaction");
+}
+| TRANSFORM
+ {
+ $$ = mm_strdup("transform");
+}
+| TREAT
+ {
+ $$ = mm_strdup("treat");
+}
+| TRIGGER
+ {
+ $$ = mm_strdup("trigger");
+}
+| TRIM
+ {
+ $$ = mm_strdup("trim");
+}
+| TRUE_P
+ {
+ $$ = mm_strdup("true");
+}
+| TRUNCATE
+ {
+ $$ = mm_strdup("truncate");
+}
+| TRUSTED
+ {
+ $$ = mm_strdup("trusted");
+}
+| TYPE_P
+ {
+ $$ = mm_strdup("type");
+}
+| TYPES_P
+ {
+ $$ = mm_strdup("types");
+}
+| UESCAPE
+ {
+ $$ = mm_strdup("uescape");
+}
+| UNBOUNDED
+ {
+ $$ = mm_strdup("unbounded");
+}
+| UNCOMMITTED
+ {
+ $$ = mm_strdup("uncommitted");
+}
+| UNENCRYPTED
+ {
+ $$ = mm_strdup("unencrypted");
+}
+| UNIQUE
+ {
+ $$ = mm_strdup("unique");
+}
+| UNKNOWN
+ {
+ $$ = mm_strdup("unknown");
+}
+| UNLISTEN
+ {
+ $$ = mm_strdup("unlisten");
+}
+| UNLOGGED
+ {
+ $$ = mm_strdup("unlogged");
+}
+| UNTIL
+ {
+ $$ = mm_strdup("until");
+}
+| UPDATE
+ {
+ $$ = mm_strdup("update");
+}
+| USER
+ {
+ $$ = mm_strdup("user");
+}
+| USING
+ {
+ $$ = mm_strdup("using");
+}
+| VACUUM
+ {
+ $$ = mm_strdup("vacuum");
+}
+| VALID
+ {
+ $$ = mm_strdup("valid");
+}
+| VALIDATE
+ {
+ $$ = mm_strdup("validate");
+}
+| VALIDATOR
+ {
+ $$ = mm_strdup("validator");
+}
+| VALUE_P
+ {
+ $$ = mm_strdup("value");
+}
+| VALUES
+ {
+ $$ = mm_strdup("values");
+}
+| VARCHAR
+ {
+ $$ = mm_strdup("varchar");
+}
+| VARIADIC
+ {
+ $$ = mm_strdup("variadic");
+}
+| VERBOSE
+ {
+ $$ = mm_strdup("verbose");
+}
+| VERSION_P
+ {
+ $$ = mm_strdup("version");
+}
+| VIEW
+ {
+ $$ = mm_strdup("view");
+}
+| VIEWS
+ {
+ $$ = mm_strdup("views");
+}
+| VOLATILE
+ {
+ $$ = mm_strdup("volatile");
+}
+| WHEN
+ {
+ $$ = mm_strdup("when");
+}
+| WHITESPACE_P
+ {
+ $$ = mm_strdup("whitespace");
+}
+| WORK
+ {
+ $$ = mm_strdup("work");
+}
+| WRAPPER
+ {
+ $$ = mm_strdup("wrapper");
+}
+| WRITE
+ {
+ $$ = mm_strdup("write");
+}
+| XML_P
+ {
+ $$ = mm_strdup("xml");
+}
+| XMLATTRIBUTES
+ {
+ $$ = mm_strdup("xmlattributes");
+}
+| XMLCONCAT
+ {
+ $$ = mm_strdup("xmlconcat");
+}
+| XMLELEMENT
+ {
+ $$ = mm_strdup("xmlelement");
+}
+| XMLEXISTS
+ {
+ $$ = mm_strdup("xmlexists");
+}
+| XMLFOREST
+ {
+ $$ = mm_strdup("xmlforest");
+}
+| XMLNAMESPACES
+ {
+ $$ = mm_strdup("xmlnamespaces");
+}
+| XMLPARSE
+ {
+ $$ = mm_strdup("xmlparse");
+}
+| XMLPI
+ {
+ $$ = mm_strdup("xmlpi");
+}
+| XMLROOT
+ {
+ $$ = mm_strdup("xmlroot");
+}
+| XMLSERIALIZE
+ {
+ $$ = mm_strdup("xmlserialize");
+}
+| XMLTABLE
+ {
+ $$ = mm_strdup("xmltable");
+}
+| YES_P
+ {
+ $$ = mm_strdup("yes");
+}
+| ZONE
+ {
+ $$ = mm_strdup("zone");
+}
+;
+
+
+/* trailer */
+/* src/interfaces/ecpg/preproc/ecpg.trailer */
+
+statements: /*EMPTY*/
+ | statements statement
+ ;
+
+statement: ecpgstart at toplevel_stmt ';'
+ {
+ if (connection)
+ free(connection);
+ connection = NULL;
+ }
+ | ecpgstart toplevel_stmt ';'
+ {
+ if (connection)
+ free(connection);
+ connection = NULL;
+ }
+ | ecpgstart ECPGVarDeclaration
+ {
+ fprintf(base_yyout, "%s", $2);
+ free($2);
+ output_line_number();
+ }
+ | ECPGDeclaration
+ | c_thing { fprintf(base_yyout, "%s", $1); free($1); }
+ | CPP_LINE { fprintf(base_yyout, "%s", $1); free($1); }
+ | '{' { braces_open++; fputs("{", base_yyout); }
+ | '}'
+ {
+ remove_typedefs(braces_open);
+ remove_variables(braces_open--);
+ if (braces_open == 0)
+ {
+ free(current_function);
+ current_function = NULL;
+ }
+ fputs("}", base_yyout);
+ }
+ ;
+
+CreateAsStmt: CREATE OptTemp TABLE create_as_target AS {FoundInto = 0;} SelectStmt opt_with_data
+ {
+ if (FoundInto == 1)
+ mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE AS cannot specify INTO");
+
+ $$ = cat_str(7, mm_strdup("create"), $2, mm_strdup("table"), $4, mm_strdup("as"), $7, $8);
+ }
+ | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS {FoundInto = 0;} SelectStmt opt_with_data
+ {
+ if (FoundInto == 1)
+ mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE AS cannot specify INTO");
+
+ $$ = cat_str(7, mm_strdup("create"), $2, mm_strdup("table if not exists"), $7, mm_strdup("as"), $10, $11);
+ }
+ ;
+
+at: AT connection_object
+ {
+ connection = $2;
+ /*
+ * Do we have a variable as connection target? Remove the variable
+ * from the variable list or else it will be used twice.
+ */
+ if (argsinsert != NULL)
+ argsinsert = NULL;
+ }
+ ;
+
+/*
+ * the exec sql connect statement: connect to the given database
+ */
+ECPGConnect: SQL_CONNECT TO connection_target opt_connection_name opt_user
+ { $$ = cat_str(5, $3, mm_strdup(","), $5, mm_strdup(","), $4); }
+ | SQL_CONNECT TO DEFAULT
+ { $$ = mm_strdup("NULL, NULL, NULL, \"DEFAULT\""); }
+ /* also allow ORACLE syntax */
+ | SQL_CONNECT ora_user
+ { $$ = cat_str(3, mm_strdup("NULL,"), $2, mm_strdup(", NULL")); }
+ | DATABASE connection_target
+ { $$ = cat2_str($2, mm_strdup(", NULL, NULL, NULL")); }
+ ;
+
+connection_target: opt_database_name opt_server opt_port
+ {
+ /* old style: dbname[@server][:port] */
+ if (strlen($2) > 0 && *($2) != '@')
+ mmerror(PARSE_ERROR, ET_ERROR, "expected \"@\", found \"%s\"", $2);
+
+ /* C strings need to be handled differently */
+ if ($1[0] == '\"')
+ $$ = $1;
+ else
+ $$ = make3_str(mm_strdup("\""), make3_str($1, $2, $3), mm_strdup("\""));
+ }
+ | db_prefix ':' server opt_port '/' opt_database_name opt_options
+ {
+ /* new style: <tcp|unix>:postgresql://server[:port][/dbname] */
+ if (strncmp($1, "unix:postgresql", strlen("unix:postgresql")) != 0 && strncmp($1, "tcp:postgresql", strlen("tcp:postgresql")) != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported");
+
+ if (strncmp($3, "//", strlen("//")) != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "expected \"://\", found \"%s\"", $3);
+
+ if (strncmp($1, "unix", strlen("unix")) == 0 &&
+ strncmp($3 + strlen("//"), "localhost", strlen("localhost")) != 0 &&
+ strncmp($3 + strlen("//"), "127.0.0.1", strlen("127.0.0.1")) != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "Unix-domain sockets only work on \"localhost\" but not on \"%s\"", $3 + strlen("//"));
+
+ $$ = make3_str(make3_str(mm_strdup("\""), $1, mm_strdup(":")), $3, make3_str(make3_str($4, mm_strdup("/"), $6), $7, mm_strdup("\"")));
+ }
+ | char_variable
+ {
+ $$ = $1;
+ }
+ | ecpg_sconst
+ {
+ /* We can only process double quoted strings not single quotes ones,
+ * so we change the quotes.
+ * Note, that the rule for ecpg_sconst adds these single quotes. */
+ $1[0] = '\"';
+ $1[strlen($1)-1] = '\"';
+ $$ = $1;
+ }
+ ;
+
+opt_database_name: name { $$ = $1; }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
+db_prefix: ecpg_ident cvariable
+ {
+ if (strcmp($2, "postgresql") != 0 && strcmp($2, "postgres") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "expected \"postgresql\", found \"%s\"", $2);
+
+ if (strcmp($1, "tcp") != 0 && strcmp($1, "unix") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "invalid connection type: %s", $1);
+
+ $$ = make3_str($1, mm_strdup(":"), $2);
+ }
+ ;
+
+server: Op server_name
+ {
+ if (strcmp($1, "@") != 0 && strcmp($1, "//") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "expected \"@\" or \"://\", found \"%s\"", $1);
+
+ $$ = make2_str($1, $2);
+ }
+ ;
+
+opt_server: server { $$ = $1; }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
+server_name: ColId { $$ = $1; }
+ | ColId '.' server_name { $$ = make3_str($1, mm_strdup("."), $3); }
+ | IP { $$ = make_name(); }
+ ;
+
+opt_port: ':' Iconst { $$ = make2_str(mm_strdup(":"), $2); }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
+opt_connection_name: AS connection_object { $$ = $2; }
+ | /*EMPTY*/ { $$ = mm_strdup("NULL"); }
+ ;
+
+opt_user: USER ora_user { $$ = $2; }
+ | /*EMPTY*/ { $$ = mm_strdup("NULL, NULL"); }
+ ;
+
+ora_user: user_name
+ { $$ = cat2_str($1, mm_strdup(", NULL")); }
+ | user_name '/' user_name
+ { $$ = cat_str(3, $1, mm_strdup(","), $3); }
+ | user_name SQL_IDENTIFIED BY user_name
+ { $$ = cat_str(3, $1, mm_strdup(","), $4); }
+ | user_name USING user_name
+ { $$ = cat_str(3, $1, mm_strdup(","), $3); }
+ ;
+
+user_name: RoleId
+ {
+ if ($1[0] == '\"')
+ $$ = $1;
+ else
+ $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
+ }
+ | ecpg_sconst
+ {
+ if ($1[0] == '\"')
+ $$ = $1;
+ else
+ $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
+ }
+ | civar
+ {
+ enum ECPGttype type = argsinsert->variable->type->type;
+
+ /* if array see what's inside */
+ if (type == ECPGt_array)
+ type = argsinsert->variable->type->u.element->type;
+
+ /* handle varchars */
+ if (type == ECPGt_varchar)
+ $$ = make2_str(mm_strdup(argsinsert->variable->name), mm_strdup(".arr"));
+ else
+ $$ = mm_strdup(argsinsert->variable->name);
+ }
+ ;
+
+char_variable: cvariable
+ {
+ /* check if we have a string variable */
+ struct variable *p = find_variable($1);
+ enum ECPGttype type = p->type->type;
+
+ /* If we have just one character this is not a string */
+ if (atol(p->type->size) == 1)
+ mmerror(PARSE_ERROR, ET_ERROR, "invalid data type");
+ else
+ {
+ /* if array see what's inside */
+ if (type == ECPGt_array)
+ type = p->type->u.element->type;
+
+ switch (type)
+ {
+ case ECPGt_char:
+ case ECPGt_unsigned_char:
+ case ECPGt_string:
+ $$ = $1;
+ break;
+ case ECPGt_varchar:
+ $$ = make2_str($1, mm_strdup(".arr"));
+ break;
+ default:
+ mmerror(PARSE_ERROR, ET_ERROR, "invalid data type");
+ $$ = $1;
+ break;
+ }
+ }
+ }
+ ;
+
+opt_options: Op connect_options
+ {
+ if (strlen($1) == 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "incomplete statement");
+
+ if (strcmp($1, "?") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "unrecognized token \"%s\"", $1);
+
+ $$ = make2_str(mm_strdup("?"), $2);
+ }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
+connect_options: ColId opt_opt_value
+ {
+ $$ = make2_str($1, $2);
+ }
+ | ColId opt_opt_value Op connect_options
+ {
+ if (strlen($3) == 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "incomplete statement");
+
+ if (strcmp($3, "&") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "unrecognized token \"%s\"", $3);
+
+ $$ = cat_str(3, make2_str($1, $2), $3, $4);
+ }
+ ;
+
+opt_opt_value: /*EMPTY*/
+ { $$ = EMPTY; }
+ | '=' Iconst
+ { $$ = make2_str(mm_strdup("="), $2); }
+ | '=' ecpg_ident
+ { $$ = make2_str(mm_strdup("="), $2); }
+ | '=' civar
+ { $$ = make2_str(mm_strdup("="), $2); }
+ ;
+
+prepared_name: name
+ {
+ if ($1[0] == '\"' && $1[strlen($1)-1] == '\"') /* already quoted? */
+ $$ = $1;
+ else /* not quoted => convert to lowercase */
+ {
+ size_t i;
+
+ for (i = 0; i< strlen($1); i++)
+ $1[i] = tolower((unsigned char) $1[i]);
+
+ $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\""));
+ }
+ }
+ | char_variable { $$ = $1; }
+ ;
+
+/*
+ * Declare Statement
+ */
+ECPGDeclareStmt: DECLARE prepared_name STATEMENT
+ {
+ struct declared_list *ptr = NULL;
+ /* Check whether the declared name has been defined or not */
+ for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp($2, ptr->name) == 0)
+ {
+ /* re-definition is not allowed */
+ mmerror(PARSE_ERROR, ET_ERROR, "name \"%s\" is already declared", ptr->name);
+ }
+ }
+
+ /* Add a new declared name into the g_declared_list */
+ ptr = NULL;
+ ptr = (struct declared_list *)mm_alloc(sizeof(struct declared_list));
+ if (ptr)
+ {
+ /* initial definition */
+ ptr -> name = $2;
+ if (connection)
+ ptr -> connection = mm_strdup(connection);
+ else
+ ptr -> connection = NULL;
+
+ ptr -> next = g_declared_list;
+ g_declared_list = ptr;
+ }
+
+ $$ = cat_str(3 , mm_strdup("/* declare "), mm_strdup($2), mm_strdup(" as an SQL identifier */"));
+ }
+;
+
+/*
+ * Declare a prepared cursor. The syntax is different from the standard
+ * declare statement, so we create a new rule.
+ */
+ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared_name
+ {
+ struct cursor *ptr, *this;
+ char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : mm_strdup($2);
+ int (* strcmp_fn)(const char *, const char *) = (($2[0] == ':' || $2[0] == '"') ? strcmp : pg_strcasecmp);
+ struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
+ char *comment;
+ char *con;
+
+ if (INFORMIX_MODE && pg_strcasecmp($2, "database") == 0)
+ mmfatal(PARSE_ERROR, "\"database\" cannot be used as cursor name in INFORMIX mode");
+
+ check_declared_list($7);
+ con = connection ? connection : "NULL";
+ for (ptr = cur; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp_fn($2, ptr->name) == 0)
+ {
+ /* re-definition is a bug */
+ if ($2[0] == ':')
+ mmerror(PARSE_ERROR, ET_ERROR, "using variable \"%s\" in different declare statements is not supported", $2+1);
+ else
+ mmerror(PARSE_ERROR, ET_ERROR, "cursor \"%s\" is already defined", $2);
+ }
+ }
+
+ this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+
+ /* initial definition */
+ this->next = cur;
+ this->name = $2;
+ this->function = (current_function ? mm_strdup(current_function) : NULL);
+ this->connection = connection ? mm_strdup(connection) : NULL;
+ this->command = cat_str(6, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for $1"));
+ this->argsresult = NULL;
+ this->argsresult_oos = NULL;
+
+ thisquery->type = &ecpg_query;
+ thisquery->brace_level = 0;
+ thisquery->next = NULL;
+ thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(, , __LINE__)") + strlen(con) + strlen($7));
+ sprintf(thisquery->name, "ECPGprepared_statement(%s, %s, __LINE__)", con, $7);
+
+ this->argsinsert = NULL;
+ this->argsinsert_oos = NULL;
+ if ($2[0] == ':')
+ {
+ struct variable *var = find_variable($2 + 1);
+ remove_variable_from_list(&argsinsert, var);
+ add_variable_to_head(&(this->argsinsert), var, &no_indicator);
+ }
+ add_variable_to_head(&(this->argsinsert), thisquery, &no_indicator);
+
+ cur = this;
+
+ comment = cat_str(3, mm_strdup("/*"), mm_strdup(this->command), mm_strdup("*/"));
+
+ $$ = cat_str(2, adjust_outofscope_cursor_vars(this),
+ comment);
+ }
+ ;
+
+ECPGExecuteImmediateStmt: EXECUTE IMMEDIATE execstring
+ {
+ /* execute immediate means prepare the statement and
+ * immediately execute it */
+ $$ = $3;
+ };
+/*
+ * variable declaration outside exec sql declare block
+ */
+ECPGVarDeclaration: single_vt_declaration;
+
+single_vt_declaration: type_declaration { $$ = $1; }
+ | var_declaration { $$ = $1; }
+ ;
+
+precision: NumericOnly { $$ = $1; };
+
+opt_scale: ',' NumericOnly { $$ = $2; }
+ | /* EMPTY */ { $$ = EMPTY; }
+ ;
+
+ecpg_interval: opt_interval { $$ = $1; }
+ | YEAR_P TO MINUTE_P { $$ = mm_strdup("year to minute"); }
+ | YEAR_P TO SECOND_P { $$ = mm_strdup("year to second"); }
+ | DAY_P TO DAY_P { $$ = mm_strdup("day to day"); }
+ | MONTH_P TO MONTH_P { $$ = mm_strdup("month to month"); }
+ ;
+
+/*
+ * variable declaration inside exec sql declare block
+ */
+ECPGDeclaration: sql_startdeclare
+ { fputs("/* exec sql begin declare section */", base_yyout); }
+ var_type_declarations sql_enddeclare
+ {
+ fprintf(base_yyout, "%s/* exec sql end declare section */", $3);
+ free($3);
+ output_line_number();
+ }
+ ;
+
+sql_startdeclare: ecpgstart BEGIN_P DECLARE SQL_SECTION ';' {};
+
+sql_enddeclare: ecpgstart END_P DECLARE SQL_SECTION ';' {};
+
+var_type_declarations: /*EMPTY*/ { $$ = EMPTY; }
+ | vt_declarations { $$ = $1; }
+ ;
+
+vt_declarations: single_vt_declaration { $$ = $1; }
+ | CPP_LINE { $$ = $1; }
+ | vt_declarations single_vt_declaration { $$ = cat2_str($1, $2); }
+ | vt_declarations CPP_LINE { $$ = cat2_str($1, $2); }
+ ;
+
+variable_declarations: var_declaration { $$ = $1; }
+ | variable_declarations var_declaration { $$ = cat2_str($1, $2); }
+ ;
+
+type_declaration: S_TYPEDEF
+ {
+ /* reset this variable so we see if there was */
+ /* an initializer specified */
+ initializer = 0;
+ }
+ var_type opt_pointer ECPGColLabelCommon opt_array_bounds ';'
+ {
+ add_typedef($5, $6.index1, $6.index2, $3.type_enum, $3.type_dimension, $3.type_index, initializer, *$4 ? 1 : 0);
+
+ fprintf(base_yyout, "typedef %s %s %s %s;\n", $3.type_str, *$4 ? "*" : "", $5, $6.str);
+ output_line_number();
+ $$ = mm_strdup("");
+ };
+
+var_declaration: storage_declaration
+ var_type
+ {
+ actual_type[struct_level].type_enum = $2.type_enum;
+ actual_type[struct_level].type_str = $2.type_str;
+ actual_type[struct_level].type_dimension = $2.type_dimension;
+ actual_type[struct_level].type_index = $2.type_index;
+ actual_type[struct_level].type_sizeof = $2.type_sizeof;
+
+ actual_startline[struct_level] = hashline_number();
+ }
+ variable_list ';'
+ {
+ $$ = cat_str(5, actual_startline[struct_level], $1, $2.type_str, $4, mm_strdup(";\n"));
+ }
+ | var_type
+ {
+ actual_type[struct_level].type_enum = $1.type_enum;
+ actual_type[struct_level].type_str = $1.type_str;
+ actual_type[struct_level].type_dimension = $1.type_dimension;
+ actual_type[struct_level].type_index = $1.type_index;
+ actual_type[struct_level].type_sizeof = $1.type_sizeof;
+
+ actual_startline[struct_level] = hashline_number();
+ }
+ variable_list ';'
+ {
+ $$ = cat_str(4, actual_startline[struct_level], $1.type_str, $3, mm_strdup(";\n"));
+ }
+ | struct_union_type_with_symbol ';'
+ {
+ $$ = cat2_str($1, mm_strdup(";"));
+ }
+ ;
+
+opt_bit_field: ':' Iconst { $$ =cat2_str(mm_strdup(":"), $2); }
+ | /* EMPTY */ { $$ = EMPTY; }
+ ;
+
+storage_declaration: storage_clause storage_modifier
+ {$$ = cat2_str ($1, $2); }
+ | storage_clause {$$ = $1; }
+ | storage_modifier {$$ = $1; }
+ ;
+
+storage_clause : S_EXTERN { $$ = mm_strdup("extern"); }
+ | S_STATIC { $$ = mm_strdup("static"); }
+ | S_REGISTER { $$ = mm_strdup("register"); }
+ | S_AUTO { $$ = mm_strdup("auto"); }
+ ;
+
+storage_modifier : S_CONST { $$ = mm_strdup("const"); }
+ | S_VOLATILE { $$ = mm_strdup("volatile"); }
+ ;
+
+var_type: simple_type
+ {
+ $$.type_enum = $1;
+ $$.type_str = mm_strdup(ecpg_type_name($1));
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | struct_union_type
+ {
+ $$.type_str = $1;
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+
+ if (strncmp($1, "struct", sizeof("struct")-1) == 0)
+ {
+ $$.type_enum = ECPGt_struct;
+ $$.type_sizeof = ECPGstruct_sizeof;
+ }
+ else
+ {
+ $$.type_enum = ECPGt_union;
+ $$.type_sizeof = NULL;
+ }
+ }
+ | enum_type
+ {
+ $$.type_str = $1;
+ $$.type_enum = ECPGt_int;
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | ECPGColLabelCommon '(' precision opt_scale ')'
+ {
+ if (strcmp($1, "numeric") == 0)
+ {
+ $$.type_enum = ECPGt_numeric;
+ $$.type_str = mm_strdup("numeric");
+ }
+ else if (strcmp($1, "decimal") == 0)
+ {
+ $$.type_enum = ECPGt_decimal;
+ $$.type_str = mm_strdup("decimal");
+ }
+ else
+ {
+ mmerror(PARSE_ERROR, ET_ERROR, "only data types numeric and decimal have precision/scale argument");
+ $$.type_enum = ECPGt_numeric;
+ $$.type_str = mm_strdup("numeric");
+ }
+
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ | ECPGColLabelCommon ecpg_interval
+ {
+ if (strlen($2) != 0 && strcmp ($1, "datetime") != 0 && strcmp ($1, "interval") != 0)
+ mmerror (PARSE_ERROR, ET_ERROR, "interval specification not allowed here");
+
+ /*
+ * Check for type names that the SQL grammar treats as
+ * unreserved keywords
+ */
+ if (strcmp($1, "varchar") == 0)
+ {
+ $$.type_enum = ECPGt_varchar;
+ $$.type_str = EMPTY; /*mm_strdup("varchar");*/
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else if (strcmp($1, "bytea") == 0)
+ {
+ $$.type_enum = ECPGt_bytea;
+ $$.type_str = EMPTY;
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else if (strcmp($1, "float") == 0)
+ {
+ $$.type_enum = ECPGt_float;
+ $$.type_str = mm_strdup("float");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else if (strcmp($1, "double") == 0)
+ {
+ $$.type_enum = ECPGt_double;
+ $$.type_str = mm_strdup("double");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else if (strcmp($1, "numeric") == 0)
+ {
+ $$.type_enum = ECPGt_numeric;
+ $$.type_str = mm_strdup("numeric");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else if (strcmp($1, "decimal") == 0)
+ {
+ $$.type_enum = ECPGt_decimal;
+ $$.type_str = mm_strdup("decimal");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else if (strcmp($1, "date") == 0)
+ {
+ $$.type_enum = ECPGt_date;
+ $$.type_str = mm_strdup("date");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else if (strcmp($1, "timestamp") == 0)
+ {
+ $$.type_enum = ECPGt_timestamp;
+ $$.type_str = mm_strdup("timestamp");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else if (strcmp($1, "interval") == 0)
+ {
+ $$.type_enum = ECPGt_interval;
+ $$.type_str = mm_strdup("interval");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else if (strcmp($1, "datetime") == 0)
+ {
+ $$.type_enum = ECPGt_timestamp;
+ $$.type_str = mm_strdup("timestamp");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else if ((strcmp($1, "string") == 0) && INFORMIX_MODE)
+ {
+ $$.type_enum = ECPGt_string;
+ $$.type_str = mm_strdup("char");
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = NULL;
+ }
+ else
+ {
+ /* this is for typedef'ed types */
+ struct typedefs *this = get_typedef($1);
+
+ $$.type_str = (this->type->type_enum == ECPGt_varchar || this->type->type_enum == ECPGt_bytea) ? EMPTY : mm_strdup(this->name);
+ $$.type_enum = this->type->type_enum;
+ $$.type_dimension = this->type->type_dimension;
+ $$.type_index = this->type->type_index;
+ if (this->type->type_sizeof && strlen(this->type->type_sizeof) != 0)
+ $$.type_sizeof = this->type->type_sizeof;
+ else
+ $$.type_sizeof = cat_str(3, mm_strdup("sizeof("), mm_strdup(this->name), mm_strdup(")"));
+
+ struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
+ }
+ }
+ | s_struct_union_symbol
+ {
+ /* this is for named structs/unions */
+ char *name;
+ struct typedefs *this;
+ bool forward = (forward_name != NULL && strcmp($1.symbol, forward_name) == 0 && strcmp($1.su, "struct") == 0);
+
+ name = cat2_str($1.su, $1.symbol);
+ /* Do we have a forward definition? */
+ if (!forward)
+ {
+ /* No */
+
+ this = get_typedef(name);
+ $$.type_str = mm_strdup(this->name);
+ $$.type_enum = this->type->type_enum;
+ $$.type_dimension = this->type->type_dimension;
+ $$.type_index = this->type->type_index;
+ $$.type_sizeof = this->type->type_sizeof;
+ struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
+ free(name);
+ }
+ else
+ {
+ $$.type_str = name;
+ $$.type_enum = ECPGt_long;
+ $$.type_dimension = mm_strdup("-1");
+ $$.type_index = mm_strdup("-1");
+ $$.type_sizeof = mm_strdup("");
+ struct_member_list[struct_level] = NULL;
+ }
+ }
+ ;
+
+enum_type: ENUM_P symbol enum_definition
+ { $$ = cat_str(3, mm_strdup("enum"), $2, $3); }
+ | ENUM_P enum_definition
+ { $$ = cat2_str(mm_strdup("enum"), $2); }
+ | ENUM_P symbol
+ { $$ = cat2_str(mm_strdup("enum"), $2); }
+ ;
+
+enum_definition: '{' c_list '}'
+ { $$ = cat_str(3, mm_strdup("{"), $2, mm_strdup("}")); };
+
+struct_union_type_with_symbol: s_struct_union_symbol
+ {
+ struct_member_list[struct_level++] = NULL;
+ if (struct_level >= STRUCT_DEPTH)
+ mmerror(PARSE_ERROR, ET_ERROR, "too many levels in nested structure/union definition");
+ forward_name = mm_strdup($1.symbol);
+ }
+ '{' variable_declarations '}'
+ {
+ struct typedefs *ptr, *this;
+ struct this_type su_type;
+
+ ECPGfree_struct_member(struct_member_list[struct_level]);
+ struct_member_list[struct_level] = NULL;
+ struct_level--;
+ if (strncmp($1.su, "struct", sizeof("struct")-1) == 0)
+ su_type.type_enum = ECPGt_struct;
+ else
+ su_type.type_enum = ECPGt_union;
+ su_type.type_str = cat2_str($1.su, $1.symbol);
+ free(forward_name);
+ forward_name = NULL;
+
+ /* This is essentially a typedef but needs the keyword struct/union as well.
+ * So we create the typedef for each struct definition with symbol */
+ for (ptr = types; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp(su_type.type_str, ptr->name) == 0)
+ /* re-definition is a bug */
+ mmerror(PARSE_ERROR, ET_ERROR, "type \"%s\" is already defined", su_type.type_str);
+ }
+
+ this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
+
+ /* initial definition */
+ this->next = types;
+ this->name = mm_strdup(su_type.type_str);
+ this->brace_level = braces_open;
+ this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
+ this->type->type_enum = su_type.type_enum;
+ this->type->type_str = mm_strdup(su_type.type_str);
+ this->type->type_dimension = mm_strdup("-1"); /* dimension of array */
+ this->type->type_index = mm_strdup("-1"); /* length of string */
+ this->type->type_sizeof = ECPGstruct_sizeof;
+ this->struct_member_list = struct_member_list[struct_level];
+
+ types = this;
+ $$ = cat_str(4, su_type.type_str, mm_strdup("{"), $4, mm_strdup("}"));
+ }
+ ;
+
+struct_union_type: struct_union_type_with_symbol { $$ = $1; }
+ | s_struct_union
+ {
+ struct_member_list[struct_level++] = NULL;
+ if (struct_level >= STRUCT_DEPTH)
+ mmerror(PARSE_ERROR, ET_ERROR, "too many levels in nested structure/union definition");
+ }
+ '{' variable_declarations '}'
+ {
+ ECPGfree_struct_member(struct_member_list[struct_level]);
+ struct_member_list[struct_level] = NULL;
+ struct_level--;
+ $$ = cat_str(4, $1, mm_strdup("{"), $4, mm_strdup("}"));
+ }
+ ;
+
+s_struct_union_symbol: SQL_STRUCT symbol
+ {
+ $$.su = mm_strdup("struct");
+ $$.symbol = $2;
+ ECPGstruct_sizeof = cat_str(3, mm_strdup("sizeof("), cat2_str(mm_strdup($$.su), mm_strdup($$.symbol)), mm_strdup(")"));
+ }
+ | UNION symbol
+ {
+ $$.su = mm_strdup("union");
+ $$.symbol = $2;
+ }
+ ;
+
+s_struct_union: SQL_STRUCT
+ {
+ ECPGstruct_sizeof = mm_strdup(""); /* This must not be NULL to distinguish from simple types. */
+ $$ = mm_strdup("struct");
+ }
+ | UNION
+ {
+ $$ = mm_strdup("union");
+ }
+ ;
+
+simple_type: unsigned_type { $$=$1; }
+ | opt_signed signed_type { $$=$2; }
+ ;
+
+unsigned_type: SQL_UNSIGNED SQL_SHORT { $$ = ECPGt_unsigned_short; }
+ | SQL_UNSIGNED SQL_SHORT INT_P { $$ = ECPGt_unsigned_short; }
+ | SQL_UNSIGNED { $$ = ECPGt_unsigned_int; }
+ | SQL_UNSIGNED INT_P { $$ = ECPGt_unsigned_int; }
+ | SQL_UNSIGNED SQL_LONG { $$ = ECPGt_unsigned_long; }
+ | SQL_UNSIGNED SQL_LONG INT_P { $$ = ECPGt_unsigned_long; }
+ | SQL_UNSIGNED SQL_LONG SQL_LONG { $$ = ECPGt_unsigned_long_long; }
+ | SQL_UNSIGNED SQL_LONG SQL_LONG INT_P { $$ = ECPGt_unsigned_long_long; }
+ | SQL_UNSIGNED CHAR_P { $$ = ECPGt_unsigned_char; }
+ ;
+
+signed_type: SQL_SHORT { $$ = ECPGt_short; }
+ | SQL_SHORT INT_P { $$ = ECPGt_short; }
+ | INT_P { $$ = ECPGt_int; }
+ | SQL_LONG { $$ = ECPGt_long; }
+ | SQL_LONG INT_P { $$ = ECPGt_long; }
+ | SQL_LONG SQL_LONG { $$ = ECPGt_long_long; }
+ | SQL_LONG SQL_LONG INT_P { $$ = ECPGt_long_long; }
+ | SQL_BOOL { $$ = ECPGt_bool; }
+ | CHAR_P { $$ = ECPGt_char; }
+ | DOUBLE_P { $$ = ECPGt_double; }
+ ;
+
+opt_signed: SQL_SIGNED
+ | /* EMPTY */
+ ;
+
+variable_list: variable
+ { $$ = $1; }
+ | variable_list ',' variable
+ {
+ if (actual_type[struct_level].type_enum == ECPGt_varchar || actual_type[struct_level].type_enum == ECPGt_bytea)
+ $$ = cat_str(3, $1, mm_strdup(";"), $3);
+ else
+ $$ = cat_str(3, $1, mm_strdup(","), $3);
+ }
+ ;
+
+variable: opt_pointer ECPGColLabel opt_array_bounds opt_bit_field opt_initializer
+ {
+ struct ECPGtype * type;
+ char *dimension = $3.index1; /* dimension of array */
+ char *length = $3.index2; /* length of string */
+ char *dim_str;
+ char *vcn;
+ int *varlen_type_counter;
+ char *struct_name;
+
+ adjust_array(actual_type[struct_level].type_enum, &dimension, &length, actual_type[struct_level].type_dimension, actual_type[struct_level].type_index, strlen($1), false);
+ switch (actual_type[struct_level].type_enum)
+ {
+ case ECPGt_struct:
+ case ECPGt_union:
+ if (atoi(dimension) < 0)
+ 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);
+ else
+ 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);
+
+ $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
+ break;
+
+ case ECPGt_varchar:
+ case ECPGt_bytea:
+ if (actual_type[struct_level].type_enum == ECPGt_varchar)
+ {
+ varlen_type_counter = &varchar_counter;
+ struct_name = " struct varchar_";
+ }
+ else
+ {
+ varlen_type_counter = &bytea_counter;
+ struct_name = " struct bytea_";
+ }
+ if (atoi(dimension) < 0)
+ type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length, *varlen_type_counter);
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length, *varlen_type_counter), dimension);
+
+ if (strcmp(dimension, "0") == 0 || abs(atoi(dimension)) == 1)
+ dim_str=mm_strdup("");
+ else
+ dim_str=cat_str(3, mm_strdup("["), mm_strdup(dimension), mm_strdup("]"));
+ /* cannot check for atoi <= 0 because a defined constant will yield 0 here as well */
+ if (atoi(length) < 0 || strcmp(length, "0") == 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "pointers to varchar are not implemented");
+
+ /* make sure varchar struct name is unique by adding a unique counter to its definition */
+ vcn = (char *) mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ sprintf(vcn, "%d", *varlen_type_counter);
+ if (strcmp(dimension, "0") == 0)
+ $$ = cat_str(7, make2_str(mm_strdup(struct_name), vcn), mm_strdup(" { int len; char arr["), mm_strdup(length), mm_strdup("]; } *"), mm_strdup($2), $4, $5);
+ else
+ $$ = cat_str(8, make2_str(mm_strdup(struct_name), vcn), mm_strdup(" { int len; char arr["), mm_strdup(length), mm_strdup("]; } "), mm_strdup($2), dim_str, $4, $5);
+ (*varlen_type_counter)++;
+ break;
+
+ case ECPGt_char:
+ case ECPGt_unsigned_char:
+ case ECPGt_string:
+ if (atoi(dimension) == -1)
+ {
+ int i = strlen($5);
+
+ if (atoi(length) == -1 && i > 0) /* char <var>[] = "string" */
+ {
+ /* if we have an initializer but no string size set, let's use the initializer's length */
+ free(length);
+ length = mm_alloc(i+sizeof("sizeof()"));
+ sprintf(length, "sizeof(%s)", $5+2);
+ }
+ type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length, 0);
+ }
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length, 0), dimension);
+
+ $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
+ break;
+
+ default:
+ if (atoi(dimension) < 0)
+ type = ECPGmake_simple_type(actual_type[struct_level].type_enum, mm_strdup("1"), 0);
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, mm_strdup("1"), 0), dimension);
+
+ $$ = cat_str(5, $1, mm_strdup($2), $3.str, $4, $5);
+ break;
+ }
+
+ if (struct_level == 0)
+ new_variable($2, type, braces_open);
+ else
+ ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1]));
+
+ free($2);
+ }
+ ;
+
+opt_initializer: /*EMPTY*/
+ { $$ = EMPTY; }
+ | '=' c_term
+ {
+ initializer = 1;
+ $$ = cat2_str(mm_strdup("="), $2);
+ }
+ ;
+
+opt_pointer: /*EMPTY*/ { $$ = EMPTY; }
+ | '*' { $$ = mm_strdup("*"); }
+ | '*' '*' { $$ = mm_strdup("**"); }
+ ;
+
+/*
+ * We try to simulate the correct DECLARE syntax here so we get dynamic SQL
+ */
+ECPGDeclare: DECLARE STATEMENT ecpg_ident
+ {
+ /* this is only supported for compatibility */
+ $$ = cat_str(3, mm_strdup("/* declare statement"), $3, mm_strdup("*/"));
+ }
+ ;
+/*
+ * the exec sql disconnect statement: disconnect from the given database
+ */
+ECPGDisconnect: SQL_DISCONNECT dis_name { $$ = $2; }
+ ;
+
+dis_name: connection_object { $$ = $1; }
+ | CURRENT_P { $$ = mm_strdup("\"CURRENT\""); }
+ | ALL { $$ = mm_strdup("\"ALL\""); }
+ | /* EMPTY */ { $$ = mm_strdup("\"CURRENT\""); }
+ ;
+
+connection_object: name { $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\"")); }
+ | DEFAULT { $$ = mm_strdup("\"DEFAULT\""); }
+ | char_variable { $$ = $1; }
+ ;
+
+execstring: char_variable
+ { $$ = $1; }
+ | CSTRING
+ { $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\"")); }
+ ;
+
+/*
+ * the exec sql free command to deallocate a previously
+ * prepared statement
+ */
+ECPGFree: SQL_FREE cursor_name { $$ = $2; }
+ | SQL_FREE ALL { $$ = mm_strdup("all"); }
+ ;
+
+/*
+ * open is an open cursor, at the moment this has to be removed
+ */
+ECPGOpen: SQL_OPEN cursor_name opt_ecpg_using
+ {
+ if ($2[0] == ':')
+ remove_variable_from_list(&argsinsert, find_variable($2 + 1));
+ $$ = $2;
+ }
+ ;
+
+opt_ecpg_using: /*EMPTY*/ { $$ = EMPTY; }
+ | ecpg_using { $$ = $1; }
+ ;
+
+ecpg_using: USING using_list { $$ = EMPTY; }
+ | using_descriptor { $$ = $1; }
+ ;
+
+using_descriptor: USING SQL_P SQL_DESCRIPTOR quoted_ident_stringvar
+ {
+ add_variable_to_head(&argsinsert, descriptor_variable($4,0), &no_indicator);
+ $$ = EMPTY;
+ }
+ | USING SQL_DESCRIPTOR name
+ {
+ add_variable_to_head(&argsinsert, sqlda_variable($3), &no_indicator);
+ $$ = EMPTY;
+ }
+ ;
+
+into_descriptor: INTO SQL_P SQL_DESCRIPTOR quoted_ident_stringvar
+ {
+ add_variable_to_head(&argsresult, descriptor_variable($4,1), &no_indicator);
+ $$ = EMPTY;
+ }
+ | INTO SQL_DESCRIPTOR name
+ {
+ add_variable_to_head(&argsresult, sqlda_variable($3), &no_indicator);
+ $$ = EMPTY;
+ }
+ ;
+
+into_sqlda: INTO name
+ {
+ add_variable_to_head(&argsresult, sqlda_variable($2), &no_indicator);
+ $$ = EMPTY;
+ }
+ ;
+
+using_list: UsingValue | UsingValue ',' using_list;
+
+UsingValue: UsingConst
+ {
+ char *length = mm_alloc(32);
+
+ sprintf(length, "%zu", strlen($1));
+ add_variable_to_head(&argsinsert, new_variable($1, ECPGmake_simple_type(ECPGt_const, length, 0), 0), &no_indicator);
+ }
+ | civar { $$ = EMPTY; }
+ | civarind { $$ = EMPTY; }
+ ;
+
+UsingConst: Iconst { $$ = $1; }
+ | '+' Iconst { $$ = cat_str(2, mm_strdup("+"), $2); }
+ | '-' Iconst { $$ = cat_str(2, mm_strdup("-"), $2); }
+ | ecpg_fconst { $$ = $1; }
+ | '+' ecpg_fconst { $$ = cat_str(2, mm_strdup("+"), $2); }
+ | '-' ecpg_fconst { $$ = cat_str(2, mm_strdup("-"), $2); }
+ | ecpg_sconst { $$ = $1; }
+ | ecpg_bconst { $$ = $1; }
+ | ecpg_xconst { $$ = $1; }
+ ;
+
+/*
+ * We accept DESCRIBE [OUTPUT] but do nothing with DESCRIBE INPUT so far.
+ */
+ECPGDescribe: SQL_DESCRIBE INPUT_P prepared_name using_descriptor
+ {
+ $$.input = 1;
+ $$.stmt_name = $3;
+ }
+ | SQL_DESCRIBE opt_output prepared_name using_descriptor
+ {
+ struct variable *var;
+ var = argsinsert->variable;
+ remove_variable_from_list(&argsinsert, var);
+ add_variable_to_head(&argsresult, var, &no_indicator);
+
+ $$.input = 0;
+ $$.stmt_name = $3;
+ }
+ | SQL_DESCRIBE opt_output prepared_name into_descriptor
+ {
+ $$.input = 0;
+ $$.stmt_name = $3;
+ }
+ | SQL_DESCRIBE INPUT_P prepared_name into_sqlda
+ {
+ $$.input = 1;
+ $$.stmt_name = $3;
+ }
+ | SQL_DESCRIBE opt_output prepared_name into_sqlda
+ {
+ $$.input = 0;
+ $$.stmt_name = $3;
+ }
+ ;
+
+opt_output: SQL_OUTPUT { $$ = mm_strdup("output"); }
+ | /* EMPTY */ { $$ = EMPTY; }
+ ;
+
+/*
+ * dynamic SQL: descriptor based access
+ * originally written by Christof Petig <christof.petig@wtal.de>
+ * and Peter Eisentraut <peter.eisentraut@credativ.de>
+ */
+
+/*
+ * allocate a descriptor
+ */
+ECPGAllocateDescr: SQL_ALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
+ {
+ add_descriptor($3,connection);
+ $$ = $3;
+ }
+ ;
+
+
+/*
+ * deallocate a descriptor
+ */
+ECPGDeallocateDescr: DEALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
+ {
+ drop_descriptor($3,connection);
+ $$ = $3;
+ }
+ ;
+
+/*
+ * manipulate a descriptor header
+ */
+
+ECPGGetDescriptorHeader: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar ECPGGetDescHeaderItems
+ { $$ = $3; }
+ ;
+
+ECPGGetDescHeaderItems: ECPGGetDescHeaderItem
+ | ECPGGetDescHeaderItems ',' ECPGGetDescHeaderItem
+ ;
+
+ECPGGetDescHeaderItem: cvariable '=' desc_header_item
+ { push_assignment($1, $3); }
+ ;
+
+
+ECPGSetDescriptorHeader: SET SQL_DESCRIPTOR quoted_ident_stringvar ECPGSetDescHeaderItems
+ { $$ = $3; }
+ ;
+
+ECPGSetDescHeaderItems: ECPGSetDescHeaderItem
+ | ECPGSetDescHeaderItems ',' ECPGSetDescHeaderItem
+ ;
+
+ECPGSetDescHeaderItem: desc_header_item '=' IntConstVar
+ {
+ push_assignment($3, $1);
+ }
+ ;
+
+IntConstVar: Iconst
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+
+ sprintf(length, "%zu", strlen($1));
+ new_variable($1, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
+ $$ = $1;
+ }
+ | cvariable
+ {
+ $$ = $1;
+ }
+ ;
+
+desc_header_item: SQL_COUNT { $$ = ECPGd_count; }
+ ;
+
+/*
+ * manipulate a descriptor
+ */
+
+ECPGGetDescriptor: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar VALUE_P IntConstVar ECPGGetDescItems
+ { $$.str = $5; $$.name = $3; }
+ ;
+
+ECPGGetDescItems: ECPGGetDescItem
+ | ECPGGetDescItems ',' ECPGGetDescItem
+ ;
+
+ECPGGetDescItem: cvariable '=' descriptor_item { push_assignment($1, $3); };
+
+
+ECPGSetDescriptor: SET SQL_DESCRIPTOR quoted_ident_stringvar VALUE_P IntConstVar ECPGSetDescItems
+ { $$.str = $5; $$.name = $3; }
+ ;
+
+ECPGSetDescItems: ECPGSetDescItem
+ | ECPGSetDescItems ',' ECPGSetDescItem
+ ;
+
+ECPGSetDescItem: descriptor_item '=' AllConstVar
+ {
+ push_assignment($3, $1);
+ }
+ ;
+
+AllConstVar: ecpg_fconst
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+
+ sprintf(length, "%zu", strlen($1));
+ new_variable($1, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
+ $$ = $1;
+ }
+
+ | IntConstVar
+ {
+ $$ = $1;
+ }
+
+ | '-' ecpg_fconst
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ char *var = cat2_str(mm_strdup("-"), $2);
+
+ sprintf(length, "%zu", strlen(var));
+ new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
+ $$ = var;
+ }
+
+ | '-' Iconst
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ char *var = cat2_str(mm_strdup("-"), $2);
+
+ sprintf(length, "%zu", strlen(var));
+ new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
+ $$ = var;
+ }
+
+ | ecpg_sconst
+ {
+ char *length = mm_alloc(sizeof(int) * CHAR_BIT * 10 / 3);
+ char *var = $1 + 1;
+
+ var[strlen(var) - 1] = '\0';
+ sprintf(length, "%zu", strlen(var));
+ new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
+ $$ = var;
+ }
+ ;
+
+descriptor_item: SQL_CARDINALITY { $$ = ECPGd_cardinality; }
+ | DATA_P { $$ = ECPGd_data; }
+ | SQL_DATETIME_INTERVAL_CODE { $$ = ECPGd_di_code; }
+ | SQL_DATETIME_INTERVAL_PRECISION { $$ = ECPGd_di_precision; }
+ | SQL_INDICATOR { $$ = ECPGd_indicator; }
+ | SQL_KEY_MEMBER { $$ = ECPGd_key_member; }
+ | SQL_LENGTH { $$ = ECPGd_length; }
+ | NAME_P { $$ = ECPGd_name; }
+ | SQL_NULLABLE { $$ = ECPGd_nullable; }
+ | SQL_OCTET_LENGTH { $$ = ECPGd_octet; }
+ | PRECISION { $$ = ECPGd_precision; }
+ | SQL_RETURNED_LENGTH { $$ = ECPGd_length; }
+ | SQL_RETURNED_OCTET_LENGTH { $$ = ECPGd_ret_octet; }
+ | SQL_SCALE { $$ = ECPGd_scale; }
+ | TYPE_P { $$ = ECPGd_type; }
+ ;
+
+/*
+ * set/reset the automatic transaction mode, this needs a different handling
+ * as the other set commands
+ */
+ECPGSetAutocommit: SET SQL_AUTOCOMMIT '=' on_off { $$ = $4; }
+ | SET SQL_AUTOCOMMIT TO on_off { $$ = $4; }
+ ;
+
+on_off: ON { $$ = mm_strdup("on"); }
+ | OFF { $$ = mm_strdup("off"); }
+ ;
+
+/*
+ * set the actual connection, this needs a different handling as the other
+ * set commands
+ */
+ECPGSetConnection: SET CONNECTION TO connection_object { $$ = $4; }
+ | SET CONNECTION '=' connection_object { $$ = $4; }
+ | SET CONNECTION connection_object { $$ = $3; }
+ ;
+
+/*
+ * define a new type for embedded SQL
+ */
+ECPGTypedef: TYPE_P
+ {
+ /* reset this variable so we see if there was */
+ /* an initializer specified */
+ initializer = 0;
+ }
+ ECPGColLabelCommon IS var_type opt_array_bounds opt_reference
+ {
+ add_typedef($3, $6.index1, $6.index2, $5.type_enum, $5.type_dimension, $5.type_index, initializer, *$7 ? 1 : 0);
+
+ if (auto_create_c == false)
+ $$ = cat_str(7, mm_strdup("/* exec sql type"), mm_strdup($3), mm_strdup("is"), mm_strdup($5.type_str), mm_strdup($6.str), $7, mm_strdup("*/"));
+ else
+ $$ = cat_str(6, mm_strdup("typedef "), mm_strdup($5.type_str), *$7?mm_strdup("*"):mm_strdup(""), mm_strdup($3), mm_strdup($6.str), mm_strdup(";"));
+ }
+ ;
+
+opt_reference: SQL_REFERENCE { $$ = mm_strdup("reference"); }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
+/*
+ * define the type of one variable for embedded SQL
+ */
+ECPGVar: SQL_VAR
+ {
+ /* reset this variable so we see if there was */
+ /* an initializer specified */
+ initializer = 0;
+ }
+ ColLabel IS var_type opt_array_bounds opt_reference
+ {
+ struct variable *p = find_variable($3);
+ char *dimension = $6.index1;
+ char *length = $6.index2;
+ struct ECPGtype * type;
+
+ if (($5.type_enum == ECPGt_struct ||
+ $5.type_enum == ECPGt_union) &&
+ initializer == 1)
+ mmerror(PARSE_ERROR, ET_ERROR, "initializer not allowed in EXEC SQL VAR command");
+ else
+ {
+ adjust_array($5.type_enum, &dimension, &length, $5.type_dimension, $5.type_index, *$7?1:0, false);
+
+ switch ($5.type_enum)
+ {
+ case ECPGt_struct:
+ case ECPGt_union:
+ if (atoi(dimension) < 0)
+ type = ECPGmake_struct_type(struct_member_list[struct_level], $5.type_enum, $5.type_str, $5.type_sizeof);
+ else
+ type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], $5.type_enum, $5.type_str, $5.type_sizeof), dimension);
+ break;
+
+ case ECPGt_varchar:
+ case ECPGt_bytea:
+ if (atoi(dimension) == -1)
+ type = ECPGmake_simple_type($5.type_enum, length, 0);
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, length, 0), dimension);
+ break;
+
+ case ECPGt_char:
+ case ECPGt_unsigned_char:
+ case ECPGt_string:
+ if (atoi(dimension) == -1)
+ type = ECPGmake_simple_type($5.type_enum, length, 0);
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, length, 0), dimension);
+ break;
+
+ default:
+ if (atoi(length) >= 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "multidimensional arrays for simple data types are not supported");
+
+ if (atoi(dimension) < 0)
+ type = ECPGmake_simple_type($5.type_enum, mm_strdup("1"), 0);
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, mm_strdup("1"), 0), dimension);
+ break;
+ }
+
+ ECPGfree_type(p->type);
+ p->type = type;
+ }
+
+ $$ = cat_str(7, mm_strdup("/* exec sql var"), mm_strdup($3), mm_strdup("is"), mm_strdup($5.type_str), mm_strdup($6.str), $7, mm_strdup("*/"));
+ }
+ ;
+
+/*
+ * whenever statement: decide what to do in case of error/no data found
+ * according to SQL standards we lack: SQLSTATE, CONSTRAINT and SQLEXCEPTION
+ */
+ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action
+ {
+ when_error.code = $<action>3.code;
+ when_error.command = $<action>3.command;
+ $$ = cat_str(3, mm_strdup("/* exec sql whenever sqlerror "), $3.str, mm_strdup("; */"));
+ }
+ | SQL_WHENEVER NOT SQL_FOUND action
+ {
+ when_nf.code = $<action>4.code;
+ when_nf.command = $<action>4.command;
+ $$ = cat_str(3, mm_strdup("/* exec sql whenever not found "), $4.str, mm_strdup("; */"));
+ }
+ | SQL_WHENEVER SQL_SQLWARNING action
+ {
+ when_warn.code = $<action>3.code;
+ when_warn.command = $<action>3.command;
+ $$ = cat_str(3, mm_strdup("/* exec sql whenever sql_warning "), $3.str, mm_strdup("; */"));
+ }
+ ;
+
+action : CONTINUE_P
+ {
+ $<action>$.code = W_NOTHING;
+ $<action>$.command = NULL;
+ $<action>$.str = mm_strdup("continue");
+ }
+ | SQL_SQLPRINT
+ {
+ $<action>$.code = W_SQLPRINT;
+ $<action>$.command = NULL;
+ $<action>$.str = mm_strdup("sqlprint");
+ }
+ | SQL_STOP
+ {
+ $<action>$.code = W_STOP;
+ $<action>$.command = NULL;
+ $<action>$.str = mm_strdup("stop");
+ }
+ | SQL_GOTO name
+ {
+ $<action>$.code = W_GOTO;
+ $<action>$.command = mm_strdup($2);
+ $<action>$.str = cat2_str(mm_strdup("goto "), $2);
+ }
+ | SQL_GO TO name
+ {
+ $<action>$.code = W_GOTO;
+ $<action>$.command = mm_strdup($3);
+ $<action>$.str = cat2_str(mm_strdup("goto "), $3);
+ }
+ | DO name '(' c_args ')'
+ {
+ $<action>$.code = W_DO;
+ $<action>$.command = cat_str(4, $2, mm_strdup("("), $4, mm_strdup(")"));
+ $<action>$.str = cat2_str(mm_strdup("do"), mm_strdup($<action>$.command));
+ }
+ | DO SQL_BREAK
+ {
+ $<action>$.code = W_BREAK;
+ $<action>$.command = NULL;
+ $<action>$.str = mm_strdup("break");
+ }
+ | DO CONTINUE_P
+ {
+ $<action>$.code = W_CONTINUE;
+ $<action>$.command = NULL;
+ $<action>$.str = mm_strdup("continue");
+ }
+ | CALL name '(' c_args ')'
+ {
+ $<action>$.code = W_DO;
+ $<action>$.command = cat_str(4, $2, mm_strdup("("), $4, mm_strdup(")"));
+ $<action>$.str = cat2_str(mm_strdup("call"), mm_strdup($<action>$.command));
+ }
+ | CALL name
+ {
+ $<action>$.code = W_DO;
+ $<action>$.command = cat2_str($2, mm_strdup("()"));
+ $<action>$.str = cat2_str(mm_strdup("call"), mm_strdup($<action>$.command));
+ }
+ ;
+
+/* some other stuff for ecpg */
+
+/* additional unreserved keywords */
+ECPGKeywords: ECPGKeywords_vanames { $$ = $1; }
+ | ECPGKeywords_rest { $$ = $1; }
+ ;
+
+ECPGKeywords_vanames: SQL_BREAK { $$ = mm_strdup("break"); }
+ | SQL_CARDINALITY { $$ = mm_strdup("cardinality"); }
+ | SQL_COUNT { $$ = mm_strdup("count"); }
+ | SQL_DATETIME_INTERVAL_CODE { $$ = mm_strdup("datetime_interval_code"); }
+ | SQL_DATETIME_INTERVAL_PRECISION { $$ = mm_strdup("datetime_interval_precision"); }
+ | SQL_FOUND { $$ = mm_strdup("found"); }
+ | SQL_GO { $$ = mm_strdup("go"); }
+ | SQL_GOTO { $$ = mm_strdup("goto"); }
+ | SQL_IDENTIFIED { $$ = mm_strdup("identified"); }
+ | SQL_INDICATOR { $$ = mm_strdup("indicator"); }
+ | SQL_KEY_MEMBER { $$ = mm_strdup("key_member"); }
+ | SQL_LENGTH { $$ = mm_strdup("length"); }
+ | SQL_NULLABLE { $$ = mm_strdup("nullable"); }
+ | SQL_OCTET_LENGTH { $$ = mm_strdup("octet_length"); }
+ | SQL_RETURNED_LENGTH { $$ = mm_strdup("returned_length"); }
+ | SQL_RETURNED_OCTET_LENGTH { $$ = mm_strdup("returned_octet_length"); }
+ | SQL_SCALE { $$ = mm_strdup("scale"); }
+ | SQL_SECTION { $$ = mm_strdup("section"); }
+ | SQL_SQLERROR { $$ = mm_strdup("sqlerror"); }
+ | SQL_SQLPRINT { $$ = mm_strdup("sqlprint"); }
+ | SQL_SQLWARNING { $$ = mm_strdup("sqlwarning"); }
+ | SQL_STOP { $$ = mm_strdup("stop"); }
+ ;
+
+ECPGKeywords_rest: SQL_CONNECT { $$ = mm_strdup("connect"); }
+ | SQL_DESCRIBE { $$ = mm_strdup("describe"); }
+ | SQL_DISCONNECT { $$ = mm_strdup("disconnect"); }
+ | SQL_OPEN { $$ = mm_strdup("open"); }
+ | SQL_VAR { $$ = mm_strdup("var"); }
+ | SQL_WHENEVER { $$ = mm_strdup("whenever"); }
+ ;
+
+/* additional keywords that can be SQL type names (but not ECPGColLabels) */
+ECPGTypeName: SQL_BOOL { $$ = mm_strdup("bool"); }
+ | SQL_LONG { $$ = mm_strdup("long"); }
+ | SQL_OUTPUT { $$ = mm_strdup("output"); }
+ | SQL_SHORT { $$ = mm_strdup("short"); }
+ | SQL_STRUCT { $$ = mm_strdup("struct"); }
+ | SQL_SIGNED { $$ = mm_strdup("signed"); }
+ | SQL_UNSIGNED { $$ = mm_strdup("unsigned"); }
+ ;
+
+symbol: ColLabel { $$ = $1; }
+ ;
+
+ECPGColId: ecpg_ident { $$ = $1; }
+ | unreserved_keyword { $$ = $1; }
+ | col_name_keyword { $$ = $1; }
+ | ECPGunreserved_interval { $$ = $1; }
+ | ECPGKeywords { $$ = $1; }
+ | ECPGCKeywords { $$ = $1; }
+ | CHAR_P { $$ = mm_strdup("char"); }
+ | VALUES { $$ = mm_strdup("values"); }
+ ;
+
+/*
+ * Name classification hierarchy.
+ *
+ * These productions should match those in the core grammar, except that
+ * we use all_unreserved_keyword instead of unreserved_keyword, and
+ * where possible include ECPG keywords as well as core keywords.
+ */
+
+/* Column identifier --- names that can be column, table, etc names.
+ */
+ColId: ecpg_ident { $$ = $1; }
+ | all_unreserved_keyword { $$ = $1; }
+ | col_name_keyword { $$ = $1; }
+ | ECPGKeywords { $$ = $1; }
+ | ECPGCKeywords { $$ = $1; }
+ | CHAR_P { $$ = mm_strdup("char"); }
+ | VALUES { $$ = mm_strdup("values"); }
+ ;
+
+/* Type/function identifier --- names that can be type or function names.
+ */
+type_function_name: ecpg_ident { $$ = $1; }
+ | all_unreserved_keyword { $$ = $1; }
+ | type_func_name_keyword { $$ = $1; }
+ | ECPGKeywords { $$ = $1; }
+ | ECPGCKeywords { $$ = $1; }
+ | ECPGTypeName { $$ = $1; }
+ ;
+
+/* Column label --- allowed labels in "AS" clauses.
+ * This presently includes *all* Postgres keywords.
+ */
+ColLabel: ECPGColLabel { $$ = $1; }
+ | ECPGTypeName { $$ = $1; }
+ | CHAR_P { $$ = mm_strdup("char"); }
+ | CURRENT_P { $$ = mm_strdup("current"); }
+ | INPUT_P { $$ = mm_strdup("input"); }
+ | INT_P { $$ = mm_strdup("int"); }
+ | TO { $$ = mm_strdup("to"); }
+ | UNION { $$ = mm_strdup("union"); }
+ | VALUES { $$ = mm_strdup("values"); }
+ | ECPGCKeywords { $$ = $1; }
+ | ECPGunreserved_interval { $$ = $1; }
+ ;
+
+ECPGColLabel: ECPGColLabelCommon { $$ = $1; }
+ | unreserved_keyword { $$ = $1; }
+ | reserved_keyword { $$ = $1; }
+ | ECPGKeywords_rest { $$ = $1; }
+ | CONNECTION { $$ = mm_strdup("connection"); }
+ ;
+
+ECPGColLabelCommon: ecpg_ident { $$ = $1; }
+ | col_name_keyword { $$ = $1; }
+ | type_func_name_keyword { $$ = $1; }
+ | ECPGKeywords_vanames { $$ = $1; }
+ ;
+
+ECPGCKeywords: S_AUTO { $$ = mm_strdup("auto"); }
+ | S_CONST { $$ = mm_strdup("const"); }
+ | S_EXTERN { $$ = mm_strdup("extern"); }
+ | S_REGISTER { $$ = mm_strdup("register"); }
+ | S_STATIC { $$ = mm_strdup("static"); }
+ | S_TYPEDEF { $$ = mm_strdup("typedef"); }
+ | S_VOLATILE { $$ = mm_strdup("volatile"); }
+ ;
+
+/* "Unreserved" keywords --- available for use as any kind of name.
+ */
+
+/*
+ * The following symbols must be excluded from ECPGColLabel and directly
+ * included into ColLabel to enable C variables to get names from ECPGColLabel:
+ * DAY_P, HOUR_P, MINUTE_P, MONTH_P, SECOND_P, YEAR_P.
+ *
+ * We also have to exclude CONNECTION, CURRENT, and INPUT for various reasons.
+ * CONNECTION can be added back in all_unreserved_keyword, but CURRENT and
+ * INPUT are reserved for ecpg purposes.
+ *
+ * The mentioned exclusions are done by $replace_line settings in parse.pl.
+ */
+all_unreserved_keyword: unreserved_keyword { $$ = $1; }
+ | ECPGunreserved_interval { $$ = $1; }
+ | CONNECTION { $$ = mm_strdup("connection"); }
+ ;
+
+ECPGunreserved_interval: DAY_P { $$ = mm_strdup("day"); }
+ | HOUR_P { $$ = mm_strdup("hour"); }
+ | MINUTE_P { $$ = mm_strdup("minute"); }
+ | MONTH_P { $$ = mm_strdup("month"); }
+ | SECOND_P { $$ = mm_strdup("second"); }
+ | YEAR_P { $$ = mm_strdup("year"); }
+ ;
+
+
+into_list : coutputvariable | into_list ',' coutputvariable
+ ;
+
+ecpgstart: SQL_START {
+ reset_variables();
+ pacounter = 1;
+ }
+ ;
+
+c_args: /*EMPTY*/ { $$ = EMPTY; }
+ | c_list { $$ = $1; }
+ ;
+
+coutputvariable: cvariable indicator
+ { add_variable_to_head(&argsresult, find_variable($1), find_variable($2)); }
+ | cvariable
+ { add_variable_to_head(&argsresult, find_variable($1), &no_indicator); }
+ ;
+
+
+civarind: cvariable indicator
+ {
+ if (find_variable($2)->type->type == ECPGt_array)
+ mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input");
+
+ add_variable_to_head(&argsinsert, find_variable($1), find_variable($2));
+ $$ = create_questionmarks($1, false);
+ }
+ ;
+
+char_civar: char_variable
+ {
+ char *ptr = strstr($1, ".arr");
+
+ if (ptr) /* varchar, we need the struct name here, not the struct element */
+ *ptr = '\0';
+ add_variable_to_head(&argsinsert, find_variable($1), &no_indicator);
+ $$ = $1;
+ }
+ ;
+
+civar: cvariable
+ {
+ add_variable_to_head(&argsinsert, find_variable($1), &no_indicator);
+ $$ = create_questionmarks($1, false);
+ }
+ ;
+
+indicator: cvariable { check_indicator((find_variable($1))->type); $$ = $1; }
+ | SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; }
+ | SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; }
+ ;
+
+cvariable: CVARIABLE
+ {
+ /* As long as multidimensional arrays are not implemented we have to check for those here */
+ char *ptr = $1;
+ int brace_open=0, brace = false;
+
+ for (; *ptr; ptr++)
+ {
+ switch (*ptr)
+ {
+ case '[':
+ if (brace)
+ mmfatal(PARSE_ERROR, "multidimensional arrays for simple data types are not supported");
+ brace_open++;
+ break;
+ case ']':
+ brace_open--;
+ if (brace_open == 0)
+ brace = true;
+ break;
+ case '\t':
+ case ' ':
+ break;
+ default:
+ if (brace_open == 0)
+ brace = false;
+ break;
+ }
+ }
+ $$ = $1;
+ }
+ ;
+
+ecpg_param: PARAM { $$ = make_name(); } ;
+
+ecpg_bconst: BCONST { $$ = $1; } ;
+
+ecpg_fconst: FCONST { $$ = make_name(); } ;
+
+ecpg_sconst: SCONST { $$ = $1; } ;
+
+ecpg_xconst: XCONST { $$ = $1; } ;
+
+ecpg_ident: IDENT { $$ = $1; }
+ | CSTRING { $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\"")); }
+ ;
+
+quoted_ident_stringvar: name
+ { $$ = make3_str(mm_strdup("\""), $1, mm_strdup("\"")); }
+ | char_variable
+ { $$ = make3_str(mm_strdup("("), $1, mm_strdup(")")); }
+ ;
+
+/*
+ * C stuff
+ */
+
+c_stuff_item: c_anything { $$ = $1; }
+ | '(' ')' { $$ = mm_strdup("()"); }
+ | '(' c_stuff ')'
+ { $$ = cat_str(3, mm_strdup("("), $2, mm_strdup(")")); }
+ ;
+
+c_stuff: c_stuff_item { $$ = $1; }
+ | c_stuff c_stuff_item
+ { $$ = cat2_str($1, $2); }
+ ;
+
+c_list: c_term { $$ = $1; }
+ | c_list ',' c_term { $$ = cat_str(3, $1, mm_strdup(","), $3); }
+ ;
+
+c_term: c_stuff { $$ = $1; }
+ | '{' c_list '}' { $$ = cat_str(3, mm_strdup("{"), $2, mm_strdup("}")); }
+ ;
+
+c_thing: c_anything { $$ = $1; }
+ | '(' { $$ = mm_strdup("("); }
+ | ')' { $$ = mm_strdup(")"); }
+ | ',' { $$ = mm_strdup(","); }
+ | ';' { $$ = mm_strdup(";"); }
+ ;
+
+c_anything: ecpg_ident { $$ = $1; }
+ | Iconst { $$ = $1; }
+ | ecpg_fconst { $$ = $1; }
+ | ecpg_sconst { $$ = $1; }
+ | '*' { $$ = mm_strdup("*"); }
+ | '+' { $$ = mm_strdup("+"); }
+ | '-' { $$ = mm_strdup("-"); }
+ | '/' { $$ = mm_strdup("/"); }
+ | '%' { $$ = mm_strdup("%"); }
+ | NULL_P { $$ = mm_strdup("NULL"); }
+ | S_ADD { $$ = mm_strdup("+="); }
+ | S_AND { $$ = mm_strdup("&&"); }
+ | S_ANYTHING { $$ = make_name(); }
+ | S_AUTO { $$ = mm_strdup("auto"); }
+ | S_CONST { $$ = mm_strdup("const"); }
+ | S_DEC { $$ = mm_strdup("--"); }
+ | S_DIV { $$ = mm_strdup("/="); }
+ | S_DOTPOINT { $$ = mm_strdup(".*"); }
+ | S_EQUAL { $$ = mm_strdup("=="); }
+ | S_EXTERN { $$ = mm_strdup("extern"); }
+ | S_INC { $$ = mm_strdup("++"); }
+ | S_LSHIFT { $$ = mm_strdup("<<"); }
+ | S_MEMBER { $$ = mm_strdup("->"); }
+ | S_MEMPOINT { $$ = mm_strdup("->*"); }
+ | S_MOD { $$ = mm_strdup("%="); }
+ | S_MUL { $$ = mm_strdup("*="); }
+ | S_NEQUAL { $$ = mm_strdup("!="); }
+ | S_OR { $$ = mm_strdup("||"); }
+ | S_REGISTER { $$ = mm_strdup("register"); }
+ | S_RSHIFT { $$ = mm_strdup(">>"); }
+ | S_STATIC { $$ = mm_strdup("static"); }
+ | S_SUB { $$ = mm_strdup("-="); }
+ | S_TYPEDEF { $$ = mm_strdup("typedef"); }
+ | S_VOLATILE { $$ = mm_strdup("volatile"); }
+ | SQL_BOOL { $$ = mm_strdup("bool"); }
+ | ENUM_P { $$ = mm_strdup("enum"); }
+ | HOUR_P { $$ = mm_strdup("hour"); }
+ | INT_P { $$ = mm_strdup("int"); }
+ | SQL_LONG { $$ = mm_strdup("long"); }
+ | MINUTE_P { $$ = mm_strdup("minute"); }
+ | MONTH_P { $$ = mm_strdup("month"); }
+ | SECOND_P { $$ = mm_strdup("second"); }
+ | SQL_SHORT { $$ = mm_strdup("short"); }
+ | SQL_SIGNED { $$ = mm_strdup("signed"); }
+ | SQL_STRUCT { $$ = mm_strdup("struct"); }
+ | SQL_UNSIGNED { $$ = mm_strdup("unsigned"); }
+ | YEAR_P { $$ = mm_strdup("year"); }
+ | CHAR_P { $$ = mm_strdup("char"); }
+ | FLOAT_P { $$ = mm_strdup("float"); }
+ | TO { $$ = mm_strdup("to"); }
+ | UNION { $$ = mm_strdup("union"); }
+ | VARCHAR { $$ = mm_strdup("varchar"); }
+ | '[' { $$ = mm_strdup("["); }
+ | ']' { $$ = mm_strdup("]"); }
+ | '=' { $$ = mm_strdup("="); }
+ | ':' { $$ = mm_strdup(":"); }
+ ;
+
+DeallocateStmt: DEALLOCATE prepared_name { check_declared_list($2); $$ = $2; }
+ | DEALLOCATE PREPARE prepared_name { check_declared_list($3); $$ = $3; }
+ | DEALLOCATE ALL { $$ = mm_strdup("all"); }
+ | DEALLOCATE PREPARE ALL { $$ = mm_strdup("all"); }
+ ;
+
+Iresult: Iconst { $$ = $1; }
+ | '(' Iresult ')' { $$ = cat_str(3, mm_strdup("("), $2, mm_strdup(")")); }
+ | Iresult '+' Iresult { $$ = cat_str(3, $1, mm_strdup("+"), $3); }
+ | Iresult '-' Iresult { $$ = cat_str(3, $1, mm_strdup("-"), $3); }
+ | Iresult '*' Iresult { $$ = cat_str(3, $1, mm_strdup("*"), $3); }
+ | Iresult '/' Iresult { $$ = cat_str(3, $1, mm_strdup("/"), $3); }
+ | Iresult '%' Iresult { $$ = cat_str(3, $1, mm_strdup("%"), $3); }
+ | ecpg_sconst { $$ = $1; }
+ | ColId { $$ = $1; }
+ | ColId '(' var_type ')' { if (pg_strcasecmp($1, "sizeof") != 0)
+ mmerror(PARSE_ERROR, ET_ERROR, "operator not allowed in variable definition");
+ else
+ $$ = cat_str(4, $1, mm_strdup("("), $3.type_str, mm_strdup(")"));
+ }
+ ;
+
+execute_rest: /* EMPTY */ { $$ = EMPTY; }
+ | ecpg_using opt_ecpg_into { $$ = EMPTY; }
+ | ecpg_into ecpg_using { $$ = EMPTY; }
+ | ecpg_into { $$ = EMPTY; }
+ ;
+
+ecpg_into: INTO into_list { $$ = EMPTY; }
+ | into_descriptor { $$ = $1; }
+ ;
+
+opt_ecpg_into: /* EMPTY */ { $$ = EMPTY; }
+ | ecpg_into { $$ = $1; }
+ ;
+
+ecpg_fetch_into: ecpg_into { $$ = $1; }
+ | using_descriptor
+ {
+ struct variable *var;
+
+ var = argsinsert->variable;
+ remove_variable_from_list(&argsinsert, var);
+ add_variable_to_head(&argsresult, var, &no_indicator);
+ $$ = $1;
+ }
+ ;
+
+opt_ecpg_fetch_into: /* EMPTY */ { $$ = EMPTY; }
+ | ecpg_fetch_into { $$ = $1; }
+ ;
+
+%%
+
+void base_yyerror(const char *error)
+{
+ /* translator: %s is typically the translation of "syntax error" */
+ mmerror(PARSE_ERROR, ET_ERROR, "%s at or near \"%s\"",
+ _(error), token_start ? token_start : base_yytext);
+}
+
+void parser_init(void)
+{
+ /* This function is empty. It only exists for compatibility with the backend parser right now. */
+}