/* GUC: advisory lock ID to use. Zero disables the feature. */ staticint post_planning_lock_id = 0;
/* Save previous planner hook user to be a good citizen */ static planner_hook_type prev_planner_hook = NULL;
/* planner_hook function to provide the desired delay */ static PlannedStmt *
delay_execution_planner(Query *parse, constchar *query_string, int cursorOptions, ParamListInfo boundParams)
{
PlannedStmt *result;
/* Invoke the planner, possibly via a previous hook user */ if (prev_planner_hook)
result = prev_planner_hook(parse, query_string, cursorOptions,
boundParams); else
result = standard_planner(parse, query_string, cursorOptions,
boundParams);
/* If enabled, delay by taking and releasing the specified lock */ if (post_planning_lock_id != 0)
{
DirectFunctionCall1(pg_advisory_lock_int8,
Int64GetDatum((int64) post_planning_lock_id));
DirectFunctionCall1(pg_advisory_unlock_int8,
Int64GetDatum((int64) post_planning_lock_id));
/* Module load function */ void
_PG_init(void)
{ /* Set up the GUC to control which lock is used */
DefineCustomIntVariable("delay_execution.post_planning_lock_id", "Sets the advisory lock ID to be locked/unlocked after planning.", "Zero disables the delay.",
&post_planning_lock_id, 0, 0, INT_MAX,
PGC_USERSET, 0,
NULL,
NULL,
NULL);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.