diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2025-11-22 19:33:34 -0500 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2025-11-22 19:33:34 -0500 |
| commit | b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c (patch) | |
| tree | 69154d2eb059b475ca9d94f6caa80e60d012c9e3 /src/include/nodes/supportnodes.h | |
| parent | c0bc9af15197e3604a6ec205a7485de21b0b21af (diff) | |
Add SupportRequestInlineInFrom planner support request.HEADorigin/masterorigin/HEADmaster
This request allows a support function to replace a function call
appearing in FROM (typically a set-returning function) with an
equivalent SELECT subquery. The subquery will then be subject
to the planner's usual optimizations, potentially allowing a much
better plan to be generated. While the planner has long done this
automatically for simple SQL-language functions, it's now possible
for extensions to do it for functions outside that group.
Notably, this could be useful for functions that are presently
implemented in PL/pgSQL and work by generating and then EXECUTE'ing
a SQL query.
Author: Paul A Jungwirth <pj@illuminatedcomputing.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/09de6afa-c33d-4d94-a5cb-afc6cea0d2bb@illuminatedcomputing.com
Diffstat (limited to 'src/include/nodes/supportnodes.h')
| -rw-r--r-- | src/include/nodes/supportnodes.h | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/include/nodes/supportnodes.h b/src/include/nodes/supportnodes.h index 7b623d54058..ea774c7ef6a 100644 --- a/src/include/nodes/supportnodes.h +++ b/src/include/nodes/supportnodes.h @@ -39,6 +39,8 @@ typedef struct PlannerInfo PlannerInfo; /* avoid including pathnodes.h here */ typedef struct IndexOptInfo IndexOptInfo; typedef struct SpecialJoinInfo SpecialJoinInfo; typedef struct WindowClause WindowClause; +typedef struct RangeTblFunction RangeTblFunction; /* ditto for parsenodes.h */ +typedef struct HeapTupleData *HeapTuple; /* and htup.h too */ /* * The Simplify request allows the support function to perform plan-time @@ -70,6 +72,34 @@ typedef struct SupportRequestSimplify } SupportRequestSimplify; /* + * The InlineInFrom request allows the support function to perform plan-time + * simplification of a call to its target function that appears in FROM. + * The rules for this are sufficiently different from ordinary expressions + * that it's best to make this a separate request from Simplify. + * + * The planner's PlannerInfo "root" is typically not needed, but can be + * consulted if it's necessary to obtain info about Vars present in + * the given node tree. Beware that root could be NULL in some usages. + * + * "rtfunc" will be a RangeTblFunction node for the support function's target + * function. The call appeared alone (and without ORDINALITY) in FROM. + * + * "proc" will be the HeapTuple for the pg_proc row of the target function. + * + * The result should be a semantically-equivalent SELECT Query tree, + * or NULL if no simplification could be performed. The tree must have + * been passed through parse analysis and rewrite. + */ +typedef struct SupportRequestInlineInFrom +{ + NodeTag type; + + PlannerInfo *root; /* Planner's infrastructure */ + RangeTblFunction *rtfunc; /* Function call to be simplified */ + HeapTuple proc; /* Function definition from pg_proc */ +} SupportRequestInlineInFrom; + +/* * The Selectivity request allows the support function to provide a * selectivity estimate for a function appearing at top level of a WHERE * clause (so it applies only to functions returning boolean). |
