/* ===================================================================== Source: update.rule ===================================================================== */ update_statement_c: KW_UPDATE table_name_not_for_column_prefix set_clause_list_uc where_upd_p { // chk_for_update_on_serial($2); if ($4==0) { A4GL_warn("UPDATE with no WHERE clause"); } $$=$3; $$->table=strdup($2); $$->where_clause=$4; $$->value_list=expand_slil($$->value_list); if ($$->column_list==0) { char colname[200]; int idtype; int isize; int rval; rval = A4GLSQL_get_columns ($2, colname, &idtype, &isize); if (rval) { $$->column_list=generate_update_column_list_for($2, $$->value_list); } } //debug_update_cmd($$); } ; where_upd_p : { $$=0; } | WHERE_CURRENT_OF fetch_cursor_name_p { if (A4GLSQLCV_check_requirement("NO_FOR_UPDATE")) { a4gl_yyerror("Your database cannot seem to handle FOR UPDATE"); } else { //rm_quotes($2); // THIS IS HIGHLY DANGEROUS - NEVER SET DROP_WHERE_CURRENT_OF // UNLESS YOU REALLY KNOW WHAT YOU ARE DOING!!!! if (A4GL_isyes(acl_getenv("DROP_WHERE_CURRENT_OF"))) { $$=0; } else { $$=A4GL_new_expr_simple_expr($2, ET_EXPR_WHERE_CURRENT_OF); A4GL_cursor_current($2); } add_feature("UPDATE_WHERE_CURRENT_OF"); } } | WHERE search_condition_sli { $$=A4GL_new_select_list_item_expr($2); } ; where_del_p : { $$=0; } | WHERE_CURRENT_OF fetch_cursor_name_p { if (A4GLSQLCV_check_requirement("NO_FOR_UPDATE")) { a4gl_yyerror("Your database cannot seem to handle FOR UPDATE"); } else { //rm_quotes($2); // THIS IS HIGHLY DANGEROUS - NEVER SET DROP_WHERE_CURRENT_OF // UNLESS YOU REALLY KNOW WHAT YOU ARE DOING!!!! if (A4GL_isyes(acl_getenv("DROP_WHERE_CURRENT_OF"))) { $$=0; } else { $$=A4GL_new_expr_simple_expr($2, ET_EXPR_WHERE_CURRENT_OF); A4GL_cursor_current($2); } add_feature("DELETE_WHERE_CURRENT_OF"); } } | WHERE search_condition_sli { $$=A4GL_new_select_list_item_expr($2); } ; set_clause_list_uc: XSET_OPEN_BRACKET upd_col_list_sl CLOSE_BRACKET EQUAL OPEN_BRACKET upd_val_list_slil CLOSE_BRACKET { add_feature("UPDATE_COLUMNLIST_EQ_VALUELIST"); $$=malloc(sizeof(struct struct_update_cmd)); $$->connid=0; $$->table=0; $$->column_list=$2; $$->value_list=$6; $$->where_clause=0; } | XSET_MULTIPLY_EQUAL_OPEN_BRACKET upd_val_list_slil CLOSE_BRACKET { $$=malloc(sizeof(struct struct_update_cmd)); $$->connid=0; $$->table=0; $$->column_list=0; /* A column list of 0 means .* */ $$->value_list=$2; $$->where_clause=0; add_feature("UPDATE_SET_STAR"); } | XSET_ident_DOT_MULTIPLY_EQUAL_OPEN_BRACKET upd_val_list_slil CLOSE_BRACKET { $$=malloc(sizeof(struct struct_update_cmd)); $$->connid=0; $$->table=0; $$->column_list=0; /* A column list of 0 means .* */ $$->value_list=$2; $$->where_clause=0; add_feature("UPDATE_SET_STAR"); } | XSET upd_columns_uc { $$=$2; add_feature("UPDATE_COLUMN_EQ_VALUE_LIST"); } | XSET_MULTIPLY_EQUAL upd_val_list_slil { char buff[200]; SPRINTF1(buff,"%s.*", $2); #ifdef SQLCOMPILER $$=strdup("IMPOSSIBLE") ; #else $$=malloc(sizeof(struct struct_update_cmd)); $$->connid=0; $$->table=0; $$->column_list=0; //* A column list of 0 means .* $$->value_list=$2; $$->where_clause=0; #endif } | XSET_ident_DOT_MULTIPLY_EQUAL upd_val_list_slil { char buff[200]; SPRINTF1(buff,"%s.*", $2); #ifdef SQLCOMPILER $$=strdup("IMPOSSIBLE") ; #else $$=malloc(sizeof(struct struct_update_cmd)); $$->connid=0; $$->table=0; $$->column_list=0; //* A column list of 0 means .* $$->value_list=$2; //$$->value_list=make_select_list_item_list_from_variable_record(buff); $$->where_clause=0; #endif } /* | XSET_MULTIPLY_EQUAL identifier KW_DOT KW_MULTIPLY { char buff[200]; SPRINTF1(buff,"%s.*", $2); #ifdef SQLCOMPILER $$=strdup("IMPOSSIBLE") ; #else $$=malloc(sizeof(struct struct_update_cmd)); $$->connid=0; $$->table=0; $$->column_list=0; //* A column list of 0 means .* $$->value_list=make_select_list_item_list_from_variable_record(buff); $$->where_clause=0; #endif } | XSET_ident_DOT_MULTIPLY_EQUAL identifier KW_DOT KW_MULTIPLY { char buff[200]; SPRINTF1(buff,"%s.*", $2); #ifdef SQLCOMPILER $$=strdup("IMPOSSIBLE") ; #else $$=malloc(sizeof(struct struct_update_cmd)); $$->connid=0; $$->table=0; $$->column_list=0; //* A column list of 0 means .* $$->value_list=make_select_list_item_list_from_variable_record(buff); $$->where_clause=0; #endif } */ ; upd_columns_uc : col_1_up { $$=malloc(sizeof(struct_update_cmd)); $$->column_list=new_str_list($1->column_name); $$->value_list=0; $$->where_clause=0; $$->value_list=local_new_select_list_item_list($1->value); } | upd_columns_uc KW_COMMA col_1_up { $$=$1; add_str_list($$->column_list, $3->column_name); local_add_select_list_item_list($$->value_list, $3->value); } ; upd_column_name : upd_column_name_specific { strcpy($$,$1); } | ATSIGN upd_column_name_specific { strcpy($$,$2); } ; upd_column_name_specific: identifier op_col_arr { struct ilist *i; i=&$2; if (strcmp($1,"rowid")==0) { add_feature("ROWID"); } ADDMAP("Use Column",$1); strcpy($$,A4GLSQLCV_make_substr(A4GL_confirm_colname(current_upd_table,$1), i->i0,i->i1,i->i2)); } | identifier KW_DOT identifier op_col_arr { struct ilist *i; if (strcmp($3,"rowid")==0) { add_feature("ROWID"); } if (A4GLSQLCV_check_requirement("NO_UPDATE_TABLE")) { strcpy($$,$3); } else { if (A4GLSQLCV_check_requirement("OMIT_UPDATE_TABLE")) { SPRINTF1($$,"%s",A4GLSQLCV_check_colname(current_upd_table,$3)); } else { SPRINTF1($$,"%s",A4GLSQLCV_check_colname(A4GLSQLCV_ownerize_tablename(NULL,$1),$3)); } } ADDMAP("Use Column",$$); i=&$4; strcpy($$,A4GLSQLCV_make_substr($$,i->i0,i->i1,i->i2)); } | identifier KW_DOT identifier KW_DOT identifier op_col_arr { struct ilist *i; if (strcmp($5,"rowid")==0) { add_feature("ROWID"); } if (A4GLSQLCV_check_requirement("NO_UPDATE_TABLE")) { strcpy($$,$5); } else { if (A4GLSQLCV_check_requirement("OMIT_UPDATE_TABLE")) { SPRINTF1($$,"%s",A4GLSQLCV_check_colname(current_upd_table,$5)); } else { SPRINTF1($$,"%s",A4GLSQLCV_check_colname(A4GLSQLCV_ownerize_tablename($1,$3),$5)); } } ADDMAP("Use Column",$$); i=&$6; strcpy($$,A4GLSQLCV_make_substr($$,i->i0,i->i1,i->i2)); } | identifier KW_DOT KW_MULTIPLY { if (A4GLSQLCV_check_requirement("NO_UPDATE_TABLE")) { strcpy($$,"*"); } else { if (A4GLSQLCV_check_requirement("OMIT_UPDATE_TABLE")) { SPRINTF1($$,"%s",A4GLSQLCV_check_colname(current_upd_table,"*")); } else { SPRINTF1($$,"%s",A4GLSQLCV_check_colname(A4GLSQLCV_ownerize_tablename(NULL,$1),"*")); } } ADDMAP("Use Column",$$); } ; col_1_up : upd_column_name EQUAL upd_val_sli { $$=malloc(sizeof(struct s_update_pair)); $$->column_name=acl_strdup($1); $$->value=$3; } ; upd_col_list_sl : upd_column_name { $$=new_str_list($1); } | upd_col_list_sl KW_COMMA upd_column_name { $$=add_str_list($1, $3); } ; upd_val_list_slil : upd_val_sli { $$=local_new_select_list_item_list($1); } | upd_val_list_slil KW_COMMA upd_val_sli { $$=local_add_select_list_item_list($1,$3); } ; upd_val_sli : value_expression_sli {$$=$1;} | KW_NULL {$$=new_select_list_item_builtin_const(E_SLI_BUILTIN_CONST_NULL); } ;