Skip to content

Commit 86b66ac

Browse files
Use callback instead of calling ExecFilterJunk() (#1059)
Use callback instead of calling ExecFilterJunk() 1. Added ExecFilterJunkFunc function pointer to JunkFilter struct; 2. Replaced ExecFilterJunk() with function pointer calls; 3. Initialized function pointer in ExecInitJunkFilter() and ExecInitJunkFilterConversion(); 4. Updated all ExecFilterJunk() calls to use the function pointer; This change makes JunkFilter's filtering behavior more extensible and customizable while maintaining existing functionality.
1 parent e37ca5b commit 86b66ac

7 files changed

Lines changed: 42 additions & 9 deletions

File tree

src/backend/executor/execExpr.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2927,7 +2927,8 @@ ExecInitWholeRowVar(ExprEvalStep *scratch, Var *variable, ExprState *state)
29272927
scratch->d.wholerow.junkFilter =
29282928
ExecInitJunkFilter(subplan->plan->targetlist,
29292929
ExecInitExtraTupleSlot(parent->state, NULL,
2930-
&TTSOpsVirtual));
2930+
&TTSOpsVirtual),
2931+
NULL);
29312932
}
29322933
}
29332934
}

src/backend/executor/execJunk.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

1717
#include "executor/executor.h"
1818

19+
static TupleTableSlot *ExecFilterJunkInternal(JunkFilter *junkfilter,
20+
TupleTableSlot *slot);
21+
1922
/*-------------------------------------------------------------------------
2023
* XXX this stuff should be rewritten to take advantage
2124
* of ExecProject() and the ProjectionInfo node.
@@ -55,9 +58,11 @@
5558
* The source targetlist is passed in. The output tuple descriptor is
5659
* built from the non-junk tlist entries.
5760
* An optional resultSlot can be passed as well; otherwise, we create one.
61+
* An optional execFilterJunkFunc can be passed as well; otherwise, we use ExecFilterJunk.
5862
*/
5963
JunkFilter *
60-
ExecInitJunkFilter(List *targetList, TupleTableSlot *slot)
64+
ExecInitJunkFilter(List *targetList, TupleTableSlot *slot,
65+
ExecFilterJunkFunc execFilterJunkFunc)
6166
{
6267
JunkFilter *junkfilter;
6368
TupleDesc cleanTupType;
@@ -120,6 +125,9 @@ ExecInitJunkFilter(List *targetList, TupleTableSlot *slot)
120125
junkfilter->jf_cleanMap = cleanMap;
121126
junkfilter->jf_resultSlot = slot;
122127

128+
Assert(execFilterJunkFunc != ExecFilterJunk);
129+
junkfilter->jf_execFilterJunkFunc = execFilterJunkFunc;
130+
123131
return junkfilter;
124132
}
125133

@@ -136,7 +144,8 @@ ExecInitJunkFilter(List *targetList, TupleTableSlot *slot)
136144
JunkFilter *
137145
ExecInitJunkFilterConversion(List *targetList,
138146
TupleDesc cleanTupType,
139-
TupleTableSlot *slot)
147+
TupleTableSlot *slot,
148+
ExecFilterJunkFunc execFilterJunkFunc)
140149
{
141150
JunkFilter *junkfilter;
142151
int cleanLength;
@@ -197,6 +206,9 @@ ExecInitJunkFilterConversion(List *targetList,
197206
junkfilter->jf_cleanMap = cleanMap;
198207
junkfilter->jf_resultSlot = slot;
199208

209+
Assert(execFilterJunkFunc != ExecFilterJunk);
210+
junkfilter->jf_execFilterJunkFunc = execFilterJunkFunc;
211+
200212
return junkfilter;
201213
}
202214

@@ -245,6 +257,15 @@ ExecFindJunkAttributeInTlist(List *targetlist, const char *attrName)
245257
*/
246258
TupleTableSlot *
247259
ExecFilterJunk(JunkFilter *junkfilter, TupleTableSlot *slot)
260+
{
261+
if (junkfilter->jf_execFilterJunkFunc)
262+
return junkfilter->jf_execFilterJunkFunc(junkfilter, slot);
263+
264+
return ExecFilterJunkInternal(junkfilter, slot);
265+
}
266+
267+
static TupleTableSlot *
268+
ExecFilterJunkInternal(JunkFilter *junkfilter, TupleTableSlot *slot)
248269
{
249270
TupleTableSlot *resultSlot;
250271
AttrNumber *cleanMap;

src/backend/executor/execMain.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2027,7 +2027,8 @@ InitPlan(QueryDesc *queryDesc, int eflags)
20272027

20282028
slot = ExecInitExtraTupleSlot(estate, NULL, &TTSOpsVirtual);
20292029
j = ExecInitJunkFilter(planstate->plan->targetlist,
2030-
slot);
2030+
slot,
2031+
NULL);
20312032
estate->es_junkFilter = j;
20322033

20332034
/* Want to return the cleaned tuple type */

src/backend/executor/functions.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -895,9 +895,10 @@ init_sql_fcache(FunctionCallInfo fcinfo, Oid collation, bool lazyEvalOK)
895895
if (rettupdesc && fcache->returnsTuple)
896896
fcache->junkFilter = ExecInitJunkFilterConversion(resulttlist,
897897
rettupdesc,
898-
slot);
898+
slot,
899+
NULL);
899900
else
900-
fcache->junkFilter = ExecInitJunkFilter(resulttlist, slot);
901+
fcache->junkFilter = ExecInitJunkFilter(resulttlist, slot, NULL);
901902
}
902903

903904
if (fcache->returnsTuple)

src/backend/executor/nodeTableFunction.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,8 @@ ExecInitTableFunction(TableFunctionScan *node, EState *estate, int eflags)
395395
/* Determine projection information for subplan */
396396
scanstate->inputscan->junkfilter =
397397
ExecInitJunkFilter(subplan->plan->targetlist,
398-
NULL /* slot */);
398+
NULL /* slot */,
399+
NULL);
399400
BlessTupleDesc(scanstate->inputscan->junkfilter->jf_cleanTupType);
400401

401402
/*

src/include/executor/executor.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,12 @@ extern void ResetTupleHashTable(TupleHashTable hashtable);
175175
* prototypes from functions in execJunk.c
176176
*/
177177
extern JunkFilter *ExecInitJunkFilter(List *targetList,
178-
TupleTableSlot *slot);
178+
TupleTableSlot *slot,
179+
ExecFilterJunkFunc execFilterJunkFunc);
179180
extern JunkFilter *ExecInitJunkFilterConversion(List *targetList,
180181
TupleDesc cleanTupType,
181-
TupleTableSlot *slot);
182+
TupleTableSlot *slot,
183+
ExecFilterJunkFunc execFilterJunkFunc);
182184
extern AttrNumber ExecFindJunkAttribute(JunkFilter *junkfilter,
183185
const char *attrName);
184186
extern AttrNumber ExecFindJunkAttributeInTlist(List *targetlist,

src/include/nodes/execnodes.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,15 +374,21 @@ typedef struct ProjectionInfo
374374
* attribute numbers of the "original" tuple and the
375375
* attribute numbers of the "clean" tuple.
376376
* resultSlot: tuple slot used to hold cleaned tuple.
377+
* execFilterJunk: function pointer to the function that will be used
378+
* to filter the junk attributes from the input tuple.
377379
* ----------------
378380
*/
381+
typedef struct JunkFilter JunkFilter;
382+
typedef TupleTableSlot* (*ExecFilterJunkFunc)(JunkFilter *junkfilter,
383+
TupleTableSlot *slot);
379384
typedef struct JunkFilter
380385
{
381386
NodeTag type;
382387
List *jf_targetList;
383388
TupleDesc jf_cleanTupType;
384389
AttrNumber *jf_cleanMap;
385390
TupleTableSlot *jf_resultSlot;
391+
ExecFilterJunkFunc jf_execFilterJunkFunc;
386392
} JunkFilter;
387393

388394
/*

0 commit comments

Comments
 (0)