Respect other extensions' ExecutorStart hooks

When we override ExecutorStart hook that has been set by another
extension we have to chain-call it not to disrupt other extension's
integrity.
This commit is contained in:
Ildar Musin 2025-02-14 15:29:16 +01:00
parent 9b499aac1a
commit 0fc733e00e
2 changed files with 21 additions and 4 deletions

1
.unreleased/pr_7712 Normal file
View File

@ -0,0 +1 @@
Fixes: #7712 Respect other extensions' ExecutorStart hooks

View File

@ -32,6 +32,7 @@ struct CaptureAttributesContext
};
static ExecutorStart_hook_type prev_ExecutorStart = NULL;
static bool ExecutorStart_hook_initialized = false;
static void
capture_var(Var *node, struct CaptureAttributesContext *context)
@ -216,8 +217,15 @@ capture_ExecutorStart(QueryDesc *queryDesc, int eflags)
ListCell *cell;
#endif
/* Call the standard executor start function to set up plan states. */
standard_ExecutorStart(queryDesc, eflags);
if (prev_ExecutorStart)
{
prev_ExecutorStart(queryDesc, eflags);
}
else
{
/* Call the standard executor start function to set up plan states. */
standard_ExecutorStart(queryDesc, eflags);
}
struct CaptureAttributesContext context = {
.rtable = queryDesc->plannedstmt->rtable,
@ -245,6 +253,14 @@ capture_ExecutorStart(QueryDesc *queryDesc, int eflags)
void
_attr_capture_init(void)
{
prev_ExecutorStart = ExecutorStart_hook;
ExecutorStart_hook = capture_ExecutorStart;
/*
* TSL init might be reexecuted so we need to make
* sure to not initialize hook multiple times
*/
if (!ExecutorStart_hook_initialized)
{
ExecutorStart_hook_initialized = true;
prev_ExecutorStart = ExecutorStart_hook;
ExecutorStart_hook = capture_ExecutorStart;
}
}