From ad4d4b2ba9593f4da4f6c7fec0d9d942f45c99a1 Mon Sep 17 00:00:00 2001 From: asfernandes Date: Mon, 7 Dec 2009 18:26:50 +0000 Subject: [PATCH] Feature CORE-2777 - Make possible to alter the default database character set without manual update of system table --- src/dsql/ddl.cpp | 4 ++++ src/dsql/parse.y | 25 ++++++++++++++----------- src/jrd/dyn_mod.epp | 3 +++ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/dsql/ddl.cpp b/src/dsql/ddl.cpp index 45fcb7ed16d..2d8013887ba 100644 --- a/src/dsql/ddl.cpp +++ b/src/dsql/ddl.cpp @@ -4254,6 +4254,10 @@ static void modify_database( CompiledStatement* statement) case nod_end_backup: statement->append_uchar(isc_dyn_end_backup); break; + case nod_dfl_charset: + statement->append_cstring(isc_dyn_fld_character_set_name, + ((dsql_str*) element->nod_arg[0])->str_data); + break; default: break; } diff --git a/src/dsql/parse.y b/src/dsql/parse.y index 1de77bfdf54..8f32b3fa16b 100644 --- a/src/dsql/parse.y +++ b/src/dsql/parse.y @@ -3158,17 +3158,20 @@ alter_db : db_alter_clause { $$ = make_node (nod_list, (int) 2, $1, $2); } ; -db_alter_clause : ADD db_file_list - { $$ = $2; } - | ADD KW_DIFFERENCE KW_FILE sql_string - { $$ = make_node (nod_difference_file, (int) 1, $4); } - | DROP KW_DIFFERENCE KW_FILE - { $$ = make_node (nod_drop_difference, (int) 0, NULL); } - | BEGIN BACKUP - { $$ = make_node (nod_begin_backup, (int) 0, NULL); } - | END BACKUP - { $$ = make_node (nod_end_backup, (int) 0, NULL); } - ; +db_alter_clause + : ADD db_file_list + { $$ = $2; } + | ADD KW_DIFFERENCE KW_FILE sql_string + { $$ = make_node(nod_difference_file, (int) 1, $4); } + | DROP KW_DIFFERENCE KW_FILE + { $$ = make_node(nod_drop_difference, (int) 0, NULL); } + | BEGIN BACKUP + { $$ = make_node(nod_begin_backup, (int) 0, NULL); } + | END BACKUP + { $$ = make_node(nod_end_backup, (int) 0, NULL); } + | SET DEFAULT CHARACTER SET symbol_character_set_name + { $$ = make_node(nod_dfl_charset, 1, $5); } + ; // ALTER TRIGGER diff --git a/src/jrd/dyn_mod.epp b/src/jrd/dyn_mod.epp index 8432d962176..befef86033d 100644 --- a/src/jrd/dyn_mod.epp +++ b/src/jrd/dyn_mod.epp @@ -305,6 +305,9 @@ void DYN_modify_database( Global* gbl, const UCHAR** ptr) break; case isc_dyn_fld_character_set_name: + if (!tdbb->getAttachment()->locksmith()) + ERR_post(Arg::Gds(isc_adm_task_denied)); + if (GET_STRING(ptr, DBB.RDB$CHARACTER_SET_NAME)) DBB.RDB$CHARACTER_SET_NAME.NULL = FALSE; else