diff --git a/src/jrd/dfw.epp b/src/jrd/dfw.epp index 1901ca30283..f3a4dd77104 100644 --- a/src/jrd/dfw.epp +++ b/src/jrd/dfw.epp @@ -373,6 +373,7 @@ static bool begin_backup(thread_db*, SSHORT, DeferredWork*, jrd_tra*); static bool end_backup(thread_db*, SSHORT, DeferredWork*, jrd_tra*); static bool user_management(thread_db*, SSHORT, DeferredWork*, jrd_tra*); static bool grant_privileges(thread_db*, SSHORT, DeferredWork*, jrd_tra*); +static bool clear_met_cache(thread_db*, SSHORT, DeferredWork*, jrd_tra*); /* ---------------------------------------------------------------- */ @@ -477,6 +478,7 @@ static const deferred_task task_table[] = { dfw_begin_backup, begin_backup }, { dfw_end_backup, end_backup }, { dfw_user_management, user_management }, + { dfw_clear_met_cache, clear_met_cache }, { dfw_null, NULL } }; @@ -5782,3 +5784,32 @@ static string get_string(const dsc* desc) return string(str, length); } + +static bool clear_met_cache(thread_db* tdbb, SSHORT phase, DeferredWork* work, jrd_tra* transaction) +{ +/************************************** + * + * c l e a r _ m e t _ c a c h e + * + ************************************** + * + * Invalidate metadata cache. Useful after changing column privileges for example. + * + **************************************/ + + SET_TDBB(tdbb); + Database* dbb = tdbb->getDatabase(); + + switch (phase) + { + case 1: + case 2: + return true; + + case 3: + MET_clear_cache(tdbb); + break; + } + + return false; +} diff --git a/src/jrd/grant.epp b/src/jrd/grant.epp index 4261eec60c1..9eaa4e6555f 100644 --- a/src/jrd/grant.epp +++ b/src/jrd/grant.epp @@ -777,6 +777,8 @@ static SecurityClass::flags_t save_field_privileges(thread_db* tdbb, desc.dsc_address = (UCHAR *) relation_name; desc.dsc_length = strlen(relation_name); DFW_post_work(transaction, dfw_update_format, &desc, 0); + + DFW_post_work(transaction, dfw_clear_met_cache, NULL, 0); } return aggregate_public; diff --git a/src/jrd/tra.h b/src/jrd/tra.h index dc5a773c579..002c996cc61 100644 --- a/src/jrd/tra.h +++ b/src/jrd/tra.h @@ -451,6 +451,7 @@ enum dfw_t { dfw_end_backup, dfw_user_management, dfw_create_generator, + dfw_clear_met_cache, // deferred works argument types dfw_arg_index_name, // index name for dfw_delete_expression_index, mandatory