1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-18 02:02:55 +03:00

Allow private state in certain planner data structures.

Extension that make extensive use of planner hooks may want to
coordinate their efforts, for example to avoid duplicate computation,
but that's currently difficult because there's no really good way to
pass data between different hooks.

To make that easier, allow for storage of extension-managed private
state in PlannerGlobal, PlannerInfo, and RelOptInfo, along very
similar lines to what we have permitted for ExplainState since commit
c65bc2e1d1.

Reviewed-by: Andrei Lepikhov <lepihov@gmail.com>
Reviewed-by: Melanie Plageman <melanieplageman@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: http://postgr.es/m/CA+TgmoYWKHU2hKr62Toyzh-kTDEnMDeLw7gkOOnjL-TnOUq0kQ@mail.gmail.com
This commit is contained in:
Robert Haas
2025-10-07 12:09:30 -04:00
parent afd532c3a8
commit 0132dddab3
5 changed files with 269 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
/*-------------------------------------------------------------------------
*
* extendplan.h
* Extend core planner objects with additional private state
*
*
* Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/optimizer/extendplan.h
*
*-------------------------------------------------------------------------
*/
#ifndef EXTENDPLAN_H
#define EXTENDPLAN_H
#include "nodes/pathnodes.h"
extern int GetPlannerExtensionId(const char *extension_name);
/*
* Get extension-specific state from a PlannerGlobal.
*/
static inline void *
GetPlannerGlobalExtensionState(PlannerGlobal *glob, int extension_id)
{
Assert(extension_id >= 0);
if (extension_id >= glob->extension_state_allocated)
return NULL;
return glob->extension_state[extension_id];
}
/*
* Get extension-specific state from a PlannerInfo.
*/
static inline void *
GetPlannerInfoExtensionState(PlannerInfo *root, int extension_id)
{
Assert(extension_id >= 0);
if (extension_id >= root->extension_state_allocated)
return NULL;
return root->extension_state[extension_id];
}
/*
* Get extension-specific state from a PlannerInfo.
*/
static inline void *
GetRelOptInfoExtensionState(RelOptInfo *rel, int extension_id)
{
Assert(extension_id >= 0);
if (extension_id >= rel->extension_state_allocated)
return NULL;
return rel->extension_state[extension_id];
}
/* Functions to store private state into various planner objects */
extern void SetPlannerGlobalExtensionState(PlannerGlobal *glob,
int extension_id,
void *opaque);
extern void SetPlannerInfoExtensionState(PlannerInfo *root, int extension_id,
void *opaque);
extern void SetRelOptInfoExtensionState(RelOptInfo *rel, int extension_id,
void *opaque);
#endif