Skip to content

Commit 10323ec

Browse files
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 9f9d297 commit 10323ec

File tree

8 files changed

+35
-13
lines changed

8 files changed

+35
-13
lines changed

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+
ExecFilterJunk);
29312932
}
29322933
}
29332934
}

src/backend/executor/execExprInterp.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4205,7 +4205,10 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
42054205

42064206
/* Apply the junkfilter if any */
42074207
if (op->d.wholerow.junkFilter != NULL)
4208-
slot = ExecFilterJunk(op->d.wholerow.junkFilter, slot);
4208+
{
4209+
JunkFilter *junkfilter = op->d.wholerow.junkFilter;
4210+
slot = junkfilter->jf_execFilterJunkFunc(junkfilter, slot);
4211+
}
42094212

42104213
/*
42114214
* If first time through, obtain tuple descriptor and check compatibility.

src/backend/executor/execJunk.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@
5555
* The source targetlist is passed in. The output tuple descriptor is
5656
* built from the non-junk tlist entries.
5757
* An optional resultSlot can be passed as well; otherwise, we create one.
58+
* An optional execFilterJunkFunc can be passed as well; otherwise, we use ExecFilterJunk.
5859
*/
5960
JunkFilter *
60-
ExecInitJunkFilter(List *targetList, TupleTableSlot *slot)
61+
ExecInitJunkFilter(List *targetList, TupleTableSlot *slot,
62+
ExecFilterJunkFunc execFilterJunkFunc)
6163
{
6264
JunkFilter *junkfilter;
6365
TupleDesc cleanTupType;
@@ -119,6 +121,8 @@ ExecInitJunkFilter(List *targetList, TupleTableSlot *slot)
119121
junkfilter->jf_cleanTupType = cleanTupType;
120122
junkfilter->jf_cleanMap = cleanMap;
121123
junkfilter->jf_resultSlot = slot;
124+
junkfilter->jf_execFilterJunkFunc =
125+
execFilterJunkFunc ? execFilterJunkFunc : ExecFilterJunk;
122126

123127
return junkfilter;
124128
}
@@ -136,7 +140,8 @@ ExecInitJunkFilter(List *targetList, TupleTableSlot *slot)
136140
JunkFilter *
137141
ExecInitJunkFilterConversion(List *targetList,
138142
TupleDesc cleanTupType,
139-
TupleTableSlot *slot)
143+
TupleTableSlot *slot,
144+
ExecFilterJunkFunc execFilterJunkFunc)
140145
{
141146
JunkFilter *junkfilter;
142147
int cleanLength;
@@ -196,6 +201,8 @@ ExecInitJunkFilterConversion(List *targetList,
196201
junkfilter->jf_cleanTupType = cleanTupType;
197202
junkfilter->jf_cleanMap = cleanMap;
198203
junkfilter->jf_resultSlot = slot;
204+
junkfilter->jf_execFilterJunkFunc =
205+
execFilterJunkFunc ? execFilterJunkFunc : ExecFilterJunk;
199206

200207
return junkfilter;
201208
}

src/backend/executor/execMain.c

Lines changed: 3 additions & 2 deletions
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+
ExecFilterJunk);
20312032
estate->es_junkFilter = j;
20322033

20332034
/* Want to return the cleaned tuple type */
@@ -2797,7 +2798,7 @@ ExecutePlan(EState *estate,
27972798
* because that tuple slot has the wrong descriptor.)
27982799
*/
27992800
if (estate->es_junkFilter != NULL)
2800-
slot = ExecFilterJunk(estate->es_junkFilter, slot);
2801+
slot = estate->es_junkFilter->jf_execFilterJunkFunc(estate->es_junkFilter, slot);
28012802

28022803
if (operation != CMD_SELECT && Gp_role == GP_ROLE_EXECUTE && !Gp_is_writer)
28032804
{

src/backend/executor/functions.c

Lines changed: 4 additions & 3 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+
ExecFilterJunk);
899900
else
900-
fcache->junkFilter = ExecInitJunkFilter(resulttlist, slot);
901+
fcache->junkFilter = ExecInitJunkFilter(resulttlist, slot, ExecFilterJunk);
901902
}
902903

903904
if (fcache->returnsTuple)
@@ -2225,7 +2226,7 @@ sqlfunction_receive(TupleTableSlot *slot, DestReceiver *self)
22252226
DR_sqlfunction *myState = (DR_sqlfunction *) self;
22262227

22272228
/* Filter tuple as needed */
2228-
slot = ExecFilterJunk(myState->filter, slot);
2229+
slot = myState->filter->jf_execFilterJunkFunc(myState->filter, slot);
22292230

22302231
/* Store the filtered tuple into the tuplestore */
22312232
tuplestore_puttupleslot(myState->tstore, slot);

src/backend/executor/nodeTableFunction.c

Lines changed: 3 additions & 2 deletions
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+
ExecFilterJunk);
399400
BlessTupleDesc(scanstate->inputscan->junkfilter->jf_cleanTupType);
400401

401402
/*
@@ -524,7 +525,7 @@ AnyTable_GetNextTuple(AnyTable t)
524525
* ----------------------------------------
525526
*/
526527

527-
slot = ExecFilterJunk(t->junkfilter, t->econtext->ecxt_outertuple);
528+
slot = t->junkfilter->jf_execFilterJunkFunc(t->junkfilter, t->econtext->ecxt_outertuple);
528529
return ExecCopySlotHeapTuple(slot);
529530
}
530531

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)