Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions src/jrd/dfw.epp
Original file line number Diff line number Diff line change
Expand Up @@ -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*);

/* ---------------------------------------------------------------- */

Expand Down Expand Up @@ -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 }
};

Expand Down Expand Up @@ -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;
}
2 changes: 2 additions & 0 deletions src/jrd/grant.epp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/jrd/tra.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down