static int QueryIsRule = 0, ForUpdateNotAllowed = 0, FoundInto = 0;
static struct this_type actual_type[STRUCT_DEPTH];
static char *actual_storage[STRUCT_DEPTH];
-static char *actual_startline[STRUCT_DEPTH];
/* temporarily store struct members while creating the data structure */
struct ECPGstruct_member *struct_member_list[STRUCT_DEPTH] = { NULL };
output_line_number()
{
if (input_filename)
- fprintf(yyout, "\n#line %d \"%s\"\n", yylineno, input_filename);
+ fprintf(yyout, "\n#line %d \"%s\"\n", yylineno + 1, input_filename);
}
static void
return(name);
}
-static char *
-hashline_number()
-{
- if (input_filename)
- {
- char* line = mm_alloc(strlen("\n#line %d \"%s\"\n") + 21 + strlen(input_filename));
- sprintf(line, "\n#line %d \"%s\"\n", yylineno, input_filename);
-
- return line;
- }
-
- return EMPTY;
-}
-
static void
output_statement(char * stmt, int mode)
{
%type <str> columnList DeleteStmt LockStmt UpdateStmt CursorStmt
%type <str> NotifyStmt columnElem copy_dirn UnlistenStmt copy_null
%type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary
-%type <str> opt_with_copy FetchStmt direction fetch_how_many portal_name
+%type <str> opt_with_copy FetchStmt opt_direction fetch_how_many opt_portal_name
%type <str> ClosePortalStmt DropStmt VacuumStmt opt_verbose
%type <str> opt_analyze opt_va_list va_list ExplainStmt index_params
%type <str> index_list func_index index_elem opt_type opt_class access_method_clause
%type <str> select_offset_value table_list using_expr join_expr
%type <str> using_list from_expr table_expr join_clause join_type
%type <str> join_qual update_list join_clause join_clause_with_union
-%type <str> opt_level opt_lock lock_type,
+%type <str> opt_level opt_lock lock_type users_in_new_group_clause
%type <str> OptConstrFromTable comment_op ConstraintAttributeSpec
%type <str> constraints_set_list constraints_set_namelist comment_fn
%type <str> constraints_set_mode comment_type comment_cl comment_ag
%type <str> ConstraintDeferrabilitySpec ConstraintTimeSpec
+%type <str> CreateGroupStmt, AlterGroupStmt, DropGroupStmt
%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen
%type <str> indicator ECPGExecute ECPGPrepare ecpg_using
%type <str> enum_type civariableonly ECPGCursorStmt ECPGDeallocate
%type <str> ECPGFree ECPGDeclare ECPGVar sql_variable_declarations
%type <str> sql_declaration sql_variable_list sql_variable opt_at
-%type <str> struct_type s_struct declaration declarations variable_declarations
+%type <str> struct_type s_struct declaration variable_declarations
%type <str> s_struct s_union union_type ECPGSetAutocommit on_off
%type <type_enum> simple_type varchar_type
opt_at: SQL_AT connection_target { connection = $2; }
stmt: AddAttrStmt { output_statement($1, 0); }
+ | AlterGroupStmt { output_statement($1, 0); }
| AlterUserStmt { output_statement($1, 0); }
| ClosePortalStmt { output_statement($1, 0); }
| CommentStmt { output_statement($1, 0); }
| CopyStmt { output_statement($1, 0); }
| CreateStmt { output_statement($1, 0); }
| CreateAsStmt { output_statement($1, 0); }
+ | CreateGroupStmt { output_statement($1, 0); }
| CreateSeqStmt { output_statement($1, 0); }
| CreatePLangStmt { output_statement($1, 0); }
| CreateTrigStmt { output_statement($1, 0); }
| DefineStmt { output_statement($1, 0); }
| DropStmt { output_statement($1, 0); }
| TruncateStmt { output_statement($1, 0); }
+ | DropGroupStmt { output_statement($1, 0); }
| DropPLangStmt { output_statement($1, 0); }
| DropTrigStmt { output_statement($1, 0); }
| DropUserStmt { output_statement($1, 0); }
user_group_clause: IN GROUP user_group_list
{
- /* the backend doesn't actually process this,
- * so an warning message is probably fairer */
- mmerror(ET_WARN, "IN GROUP is not implemented");
-
$$ = cat2_str(make_str("in group"), $3);
}
| /*EMPTY*/ { $$ = EMPTY; }
| /*EMPTY*/ { $$ = EMPTY; }
;
+
+/*****************************************************************************
+ *
+ * Create a postresql group
+ *
+ *
+ ****************************************************************************/
+CreateGroupStmt: CREATE GROUP UserId
+ {
+ $$ = cat2_str(make_str("create group"), $3);
+ }
+ | CREATE GROUP UserId WITH sysid_clause users_in_new_group_clause
+ {
+ $$ = cat_str(5, make_str("create group"), $3, make_str("with"), $5, $6);
+ }
+ ;
+
+users_in_new_group_clause: USER user_group_list { $$ = cat2_str(make_str("user"), $2); }
+ | /* EMPTY */ { $$ = EMPTY; }
+ ;
+
+
+/*****************************************************************************
+ *
+ * Alter a postresql group
+ *
+ *
+ *****************************************************************************/
+AlterGroupStmt: ALTER GROUP UserId WITH SYSID Iconst
+ {
+ $$ = cat_str(4, make_str("alter group"), $3, make_str("with sysid"), $6);
+ }
+ |
+ ALTER GROUP UserId ADD USER user_group_list
+ {
+ $$ = cat_str(4, make_str("alter group"), $3, make_str("add user"), $6);
+ }
+ |
+ ALTER GROUP UserId DROP USER user_group_list
+ {
+ $$ = cat_str(4, make_str("alter group"), $3, make_str("drop user"), $6);
+ }
+ ;
+
+/*****************************************************************************
+ *
+ * Drop a postresql group
+ *
+ *
+ *****************************************************************************/
+DropGroupStmt: DROP GROUP UserId
+ {
+ $$ = cat2_str(make_str("drop group"), $3);
+ }
+ ;
+
+
/*****************************************************************************
*
* Set PG internal variable
*
*****************************************************************************/
-FetchStmt: FETCH direction fetch_how_many portal_name INTO into_list
+FetchStmt: FETCH opt_direction fetch_how_many opt_portal_name INTO into_list
{
if (strcmp($2, "relative") == 0 && atol($3) == 0L)
mmerror(ET_ERROR, "FETCH/RELATIVE at current position is not supported");
$$ = cat_str(4, make_str("fetch"), $2, $3, $4);
}
- | FETCH fetch_how_many portal_name INTO into_list
- {
- $$ = cat_str(3, make_str("fetch"), $2, $3);
- }
- | FETCH portal_name INTO into_list
+ | MOVE opt_direction fetch_how_many opt_portal_name
{
- $$ = cat_str(2, make_str("fetch"), $2);
- }
- | MOVE direction fetch_how_many portal_name
- {
- $$ = cat_str(4, make_str("move"), $2, $3, $4);
- }
- | MOVE fetch_how_many portal_name
- {
- $$ = cat_str(3, make_str("move"), $2, $3);
- }
- | MOVE portal_name
- {
- $$ = cat_str(2, make_str("move"), $2);
+ $$ = cat_str(4, make_str("fetch"), $2, $3, $4);
}
;
-direction: FORWARD { $$ = make_str("forward"); }
+opt_direction: FORWARD { $$ = make_str("forward"); }
| BACKWARD { $$ = make_str("backward"); }
| RELATIVE { $$ = make_str("relative"); }
| ABSOLUTE
mmerror(ET_WARN, "FETCH/ABSOLUTE not supported, backend will use RELATIVE");
$$ = make_str("absolute");
}
+ | /*EMPTY*/ { $$ = EMPTY; /* default */ }
;
fetch_how_many: Iconst { $$ = $1; }
| ALL { $$ = make_str("all"); }
| NEXT { $$ = make_str("next"); }
| PRIOR { $$ = make_str("prior"); }
+ | /*EMPTY*/ { $$ = EMPTY; /*default*/ }
;
-portal_name: IN name { $$ = cat2_str(make_str("in"), $2); }
+opt_portal_name: IN name { $$ = cat2_str(make_str("in"), $2); }
| FROM name { $$ = cat2_str(make_str("from"), $2); }
- | name { $$ = cat2_str(make_str("in"), $1); }
+/* | name { $$ = cat2_str(make_str("in"), $1); }*/
+ | /*EMPTY*/ { $$ = EMPTY; }
;
/*****************************************************************************
ECPGDeclaration: sql_startdeclare
{
fputs("/* exec sql begin declare section */", yyout);
+ output_line_number();
}
variable_declarations sql_enddeclare
{
sql_enddeclare: ecpgstart END_TRANS DECLARE SQL_SECTION ';' {}
-variable_declarations: /* empty */ { $$ = EMPTY; }
- | declarations { $$ = $1; }
-
-declarations: declaration { $$ = $1; }
- | declarations declaration { $$ = cat2_str($1, $2); }
+variable_declarations: /* empty */
+ {
+ $$ = EMPTY;
+ }
+ | declaration variable_declarations
+ {
+ $$ = cat2_str($1, $2);
+ }
declaration: storage_clause
{
actual_storage[struct_level] = mm_strdup($1);
- actual_startline[struct_level] = hashline_number();
}
type
{
}
variable_list ';'
{
- $$ = cat_str(5, actual_startline[struct_level], $1, $3.type_str, $5, make_str(";\n"));
+ $$ = cat_str(4, $1, $3.type_str, $5, make_str(";\n"));
}
storage_clause : S_EXTERN { $$ = make_str("extern"); }
}
c_list: c_term { $$ = $1; }
- | c_list ',' c_term { $$ = cat_str(3, $1, make_str(","), $3); }
+ | c_term ',' c_list { $$ = cat_str(3, $1, make_str(","), $3); }
c_term: c_stuff { $$ = $1; }
| '{' c_list '}' { $$ = cat_str(3, make_str("{"), $2, make_str("}")); }