PostgreSQL Source Code  git master
nodeWindowAgg.h File Reference
#include "nodes/execnodes.h"
Include dependency graph for nodeWindowAgg.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

WindowAggStateExecInitWindowAgg (WindowAgg *node, EState *estate, int eflags)
 
void ExecEndWindowAgg (WindowAggState *node)
 
void ExecReScanWindowAgg (WindowAggState *node)
 

Function Documentation

◆ ExecEndWindowAgg()

void ExecEndWindowAgg ( WindowAggState node)

Definition at line 2014 of file nodeWindowAgg.c.

References WindowAggState::agg_row_slot, WindowStatePerAggData::aggcontext, WindowAggState::aggcontext, ExecClearTuple(), ExecEndNode(), ExecFreeExprContext(), WindowAggState::first_part_slot, i, MemoryContextDelete(), WindowAggState::numaggs, outerPlan, outerPlanState, WindowAggState::partcontext, WindowAggState::peragg, WindowAggState::perfunc, pfree(), ScanState::ps, PlanState::ps_ExprContext, release_partition(), WindowAggState::ss, ScanState::ss_ScanTupleSlot, WindowAggState::temp_slot_1, WindowAggState::temp_slot_2, and WindowAggState::tmpcontext.

Referenced by ExecEndNode().

2015 {
2017  int i;
2018 
2019  release_partition(node);
2020 
2024  ExecClearTuple(node->temp_slot_1);
2025  ExecClearTuple(node->temp_slot_2);
2026 
2027  /*
2028  * Free both the expr contexts.
2029  */
2030  ExecFreeExprContext(&node->ss.ps);
2031  node->ss.ps.ps_ExprContext = node->tmpcontext;
2032  ExecFreeExprContext(&node->ss.ps);
2033 
2034  for (i = 0; i < node->numaggs; i++)
2035  {
2036  if (node->peragg[i].aggcontext != node->aggcontext)
2038  }
2041 
2042  pfree(node->perfunc);
2043  pfree(node->peragg);
2044 
2045  outerPlan = outerPlanState(node);
2046  ExecEndNode(outerPlan);
2047 }
void MemoryContextDelete(MemoryContext context)
Definition: mcxt.c:200
ScanState ss
Definition: execnodes.h:1867
void ExecEndNode(PlanState *node)
Definition: execProcnode.c:523
ExprContext * ps_ExprContext
Definition: execnodes.h:884
TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
Definition: execTuples.c:439
TupleTableSlot * ss_ScanTupleSlot
Definition: execnodes.h:1116
static void release_partition(WindowAggState *winstate)
TupleTableSlot * temp_slot_1
Definition: execnodes.h:1916
WindowStatePerFunc perfunc
Definition: execnodes.h:1874
void ExecFreeExprContext(PlanState *planstate)
Definition: execUtils.c:603
TupleTableSlot * first_part_slot
Definition: execnodes.h:1911
ExprContext * tmpcontext
Definition: execnodes.h:1898
PlanState ps
Definition: execnodes.h:1113
void pfree(void *pointer)
Definition: mcxt.c:949
#define outerPlanState(node)
Definition: execnodes.h:896
TupleTableSlot * temp_slot_2
Definition: execnodes.h:1917
WindowStatePerAgg peragg
Definition: execnodes.h:1875
MemoryContext aggcontext
Definition: execnodes.h:1896
#define outerPlan(node)
Definition: plannodes.h:174
TupleTableSlot * agg_row_slot
Definition: execnodes.h:1915
MemoryContext aggcontext
int i
MemoryContext partcontext
Definition: execnodes.h:1895

◆ ExecInitWindowAgg()

WindowAggState* ExecInitWindowAgg ( WindowAgg node,
EState estate,
int  eflags 
)

Definition at line 1772 of file nodeWindowAgg.c.

References ACL_EXECUTE, ACL_KIND_PROC, aclcheck_error(), ACLCHECK_OK, WindowAggState::agg_row_slot, WindowAggState::agg_winobj, WindowAggState::aggcontext, WindowStatePerFuncData::aggno, ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate(), WindowFuncExprState::args, WindowObjectData::argstates, Assert, contain_volatile_functions(), CurrentMemoryContext, ExprContext::ecxt_aggnulls, ExprContext::ecxt_aggvalues, ExprContext::ecxt_per_query_memory, elog, WindowAgg::endOffset, equal(), ERROR, EXEC_FLAG_BACKWARD, EXEC_FLAG_MARK, ExecAssignExprContext(), ExecAssignProjectionInfo(), ExecAssignResultTypeFromTL(), ExecAssignScanTypeFromOuterPlan(), ExecInitExpr(), ExecInitExtraTupleSlot(), ExecInitNode(), ExecInitResultTupleSlot(), ExecInitScanTupleSlot(), PlanState::ExecProcNode, ExecSetSlotDescriptor(), execTuplesMatchPrepare(), ExecWindowAgg(), WindowAggState::first_part_slot, WindowStatePerFuncData::flinfo, fmgr_info_cxt(), fmgr_info_set_expr, WindowAgg::frameOptions, WindowAggState::frameOptions, WindowAggState::funcs, get_func_name(), get_typlenbyval(), GetUserId(), i, initialize_peragg(), InvokeFunctionExecuteHook, lfirst, list_length(), WindowObjectData::localmem, makeNode, WindowObjectData::markptr, NIL, WindowAggState::numaggs, WindowStatePerFuncData::numArguments, WindowAggState::numfuncs, WindowAggState::ordEqfunctions, WindowAgg::ordNumCols, WindowAgg::ordOperators, outerPlan, outerPlanState, palloc0(), WindowAggState::partcontext, WindowAggState::partEqfunctions, WindowAgg::partNumCols, WindowAgg::partOperators, WindowAggState::peragg, WindowAggState::perfunc, pg_proc_aclcheck(), WindowStatePerFuncData::plain_agg, WindowAgg::plan, PlanState::plan, ScanState::ps, PlanState::ps_ExprContext, Plan::qual, PlanState::qual, WindowObjectData::readptr, WindowStatePerFuncData::resulttypeByVal, WindowStatePerFuncData::resulttypeLen, WindowAggState::ss, ScanState::ss_ScanTupleSlot, WindowAgg::startOffset, WindowAggState::startOffset, PlanState::state, WindowAggState::temp_slot_1, WindowAggState::temp_slot_2, WindowAggState::tmpcontext, TupleTableSlot::tts_tupleDescriptor, WindowStatePerFuncData::wfunc, WindowFuncExprState::wfunc, WindowStatePerAggData::wfuncno, WindowFuncExprState::wfuncno, WindowStatePerFuncData::wfuncstate, WindowStatePerFuncData::winCollation, WindowFunc::winfnoid, WindowStatePerFuncData::winobj, WindowFunc::winref, WindowAgg::winref, and WindowObjectData::winstate.

Referenced by ExecInitNode().

1773 {
1774  WindowAggState *winstate;
1775  Plan *outerPlan;
1776  ExprContext *econtext;
1777  ExprContext *tmpcontext;
1778  WindowStatePerFunc perfunc;
1779  WindowStatePerAgg peragg;
1780  int numfuncs,
1781  wfuncno,
1782  numaggs,
1783  aggno;
1784  ListCell *l;
1785 
1786  /* check for unsupported flags */
1787  Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)));
1788 
1789  /*
1790  * create state structure
1791  */
1792  winstate = makeNode(WindowAggState);
1793  winstate->ss.ps.plan = (Plan *) node;
1794  winstate->ss.ps.state = estate;
1795  winstate->ss.ps.ExecProcNode = ExecWindowAgg;
1796 
1797  /*
1798  * Create expression contexts. We need two, one for per-input-tuple
1799  * processing and one for per-output-tuple processing. We cheat a little
1800  * by using ExecAssignExprContext() to build both.
1801  */
1802  ExecAssignExprContext(estate, &winstate->ss.ps);
1803  tmpcontext = winstate->ss.ps.ps_ExprContext;
1804  winstate->tmpcontext = tmpcontext;
1805  ExecAssignExprContext(estate, &winstate->ss.ps);
1806 
1807  /* Create long-lived context for storage of partition-local memory etc */
1808  winstate->partcontext =
1810  "WindowAgg Partition",
1812 
1813  /*
1814  * Create mid-lived context for aggregate trans values etc.
1815  *
1816  * Note that moving aggregates each use their own private context, not
1817  * this one.
1818  */
1819  winstate->aggcontext =
1821  "WindowAgg Aggregates",
1823 
1824  /*
1825  * tuple table initialization
1826  */
1827  ExecInitScanTupleSlot(estate, &winstate->ss);
1828  ExecInitResultTupleSlot(estate, &winstate->ss.ps);
1829  winstate->first_part_slot = ExecInitExtraTupleSlot(estate);
1830  winstate->agg_row_slot = ExecInitExtraTupleSlot(estate);
1831  winstate->temp_slot_1 = ExecInitExtraTupleSlot(estate);
1832  winstate->temp_slot_2 = ExecInitExtraTupleSlot(estate);
1833 
1834  /*
1835  * WindowAgg nodes never have quals, since they can only occur at the
1836  * logical top level of a query (ie, after any WHERE or HAVING filters)
1837  */
1838  Assert(node->plan.qual == NIL);
1839  winstate->ss.ps.qual = NULL;
1840 
1841  /*
1842  * initialize child nodes
1843  */
1844  outerPlan = outerPlan(node);
1845  outerPlanState(winstate) = ExecInitNode(outerPlan, estate, eflags);
1846 
1847  /*
1848  * initialize source tuple type (which is also the tuple type that we'll
1849  * store in the tuplestore and use in all our working slots).
1850  */
1851  ExecAssignScanTypeFromOuterPlan(&winstate->ss);
1852 
1861 
1862  /*
1863  * Initialize result tuple type and projection info.
1864  */
1865  ExecAssignResultTypeFromTL(&winstate->ss.ps);
1866  ExecAssignProjectionInfo(&winstate->ss.ps, NULL);
1867 
1868  /* Set up data for comparing tuples */
1869  if (node->partNumCols > 0)
1871  node->partOperators);
1872  if (node->ordNumCols > 0)
1874  node->ordOperators);
1875 
1876  /*
1877  * WindowAgg nodes use aggvalues and aggnulls as well as Agg nodes.
1878  */
1879  numfuncs = winstate->numfuncs;
1880  numaggs = winstate->numaggs;
1881  econtext = winstate->ss.ps.ps_ExprContext;
1882  econtext->ecxt_aggvalues = (Datum *) palloc0(sizeof(Datum) * numfuncs);
1883  econtext->ecxt_aggnulls = (bool *) palloc0(sizeof(bool) * numfuncs);
1884 
1885  /*
1886  * allocate per-wfunc/per-agg state information.
1887  */
1888  perfunc = (WindowStatePerFunc) palloc0(sizeof(WindowStatePerFuncData) * numfuncs);
1889  peragg = (WindowStatePerAgg) palloc0(sizeof(WindowStatePerAggData) * numaggs);
1890  winstate->perfunc = perfunc;
1891  winstate->peragg = peragg;
1892 
1893  wfuncno = -1;
1894  aggno = -1;
1895  foreach(l, winstate->funcs)
1896  {
1897  WindowFuncExprState *wfuncstate = (WindowFuncExprState *) lfirst(l);
1898  WindowFunc *wfunc = wfuncstate->wfunc;
1899  WindowStatePerFunc perfuncstate;
1900  AclResult aclresult;
1901  int i;
1902 
1903  if (wfunc->winref != node->winref) /* planner screwed up? */
1904  elog(ERROR, "WindowFunc with winref %u assigned to WindowAgg with winref %u",
1905  wfunc->winref, node->winref);
1906 
1907  /* Look for a previous duplicate window function */
1908  for (i = 0; i <= wfuncno; i++)
1909  {
1910  if (equal(wfunc, perfunc[i].wfunc) &&
1911  !contain_volatile_functions((Node *) wfunc))
1912  break;
1913  }
1914  if (i <= wfuncno)
1915  {
1916  /* Found a match to an existing entry, so just mark it */
1917  wfuncstate->wfuncno = i;
1918  continue;
1919  }
1920 
1921  /* Nope, so assign a new PerAgg record */
1922  perfuncstate = &perfunc[++wfuncno];
1923 
1924  /* Mark WindowFunc state node with assigned index in the result array */
1925  wfuncstate->wfuncno = wfuncno;
1926 
1927  /* Check permission to call window function */
1928  aclresult = pg_proc_aclcheck(wfunc->winfnoid, GetUserId(),
1929  ACL_EXECUTE);
1930  if (aclresult != ACLCHECK_OK)
1931  aclcheck_error(aclresult, ACL_KIND_PROC,
1932  get_func_name(wfunc->winfnoid));
1933  InvokeFunctionExecuteHook(wfunc->winfnoid);
1934 
1935  /* Fill in the perfuncstate data */
1936  perfuncstate->wfuncstate = wfuncstate;
1937  perfuncstate->wfunc = wfunc;
1938  perfuncstate->numArguments = list_length(wfuncstate->args);
1939 
1940  fmgr_info_cxt(wfunc->winfnoid, &perfuncstate->flinfo,
1941  econtext->ecxt_per_query_memory);
1942  fmgr_info_set_expr((Node *) wfunc, &perfuncstate->flinfo);
1943 
1944  perfuncstate->winCollation = wfunc->inputcollid;
1945 
1946  get_typlenbyval(wfunc->wintype,
1947  &perfuncstate->resulttypeLen,
1948  &perfuncstate->resulttypeByVal);
1949 
1950  /*
1951  * If it's really just a plain aggregate function, we'll emulate the
1952  * Agg environment for it.
1953  */
1954  perfuncstate->plain_agg = wfunc->winagg;
1955  if (wfunc->winagg)
1956  {
1957  WindowStatePerAgg peraggstate;
1958 
1959  perfuncstate->aggno = ++aggno;
1960  peraggstate = &winstate->peragg[aggno];
1961  initialize_peragg(winstate, wfunc, peraggstate);
1962  peraggstate->wfuncno = wfuncno;
1963  }
1964  else
1965  {
1967 
1968  winobj->winstate = winstate;
1969  winobj->argstates = wfuncstate->args;
1970  winobj->localmem = NULL;
1971  perfuncstate->winobj = winobj;
1972  }
1973  }
1974 
1975  /* Update numfuncs, numaggs to match number of unique functions found */
1976  winstate->numfuncs = wfuncno + 1;
1977  winstate->numaggs = aggno + 1;
1978 
1979  /* Set up WindowObject for aggregates, if needed */
1980  if (winstate->numaggs > 0)
1981  {
1982  WindowObject agg_winobj = makeNode(WindowObjectData);
1983 
1984  agg_winobj->winstate = winstate;
1985  agg_winobj->argstates = NIL;
1986  agg_winobj->localmem = NULL;
1987  /* make sure markptr = -1 to invalidate. It may not get used */
1988  agg_winobj->markptr = -1;
1989  agg_winobj->readptr = -1;
1990  winstate->agg_winobj = agg_winobj;
1991  }
1992 
1993  /* copy frame options to state node for easy access */
1994  winstate->frameOptions = node->frameOptions;
1995 
1996  /* initialize frame bound offset expressions */
1997  winstate->startOffset = ExecInitExpr((Expr *) node->startOffset,
1998  (PlanState *) winstate);
1999  winstate->endOffset = ExecInitExpr((Expr *) node->endOffset,
2000  (PlanState *) winstate);
2001 
2002  winstate->all_first = true;
2003  winstate->partition_spooled = false;
2004  winstate->more_partitions = false;
2005 
2006  return winstate;
2007 }
int ordNumCols
Definition: plannodes.h:807
#define NIL
Definition: pg_list.h:69
List * qual
Definition: plannodes.h:145
ExprState * endOffset
Definition: execnodes.h:1891
TupleTableSlot * ExecInitExtraTupleSlot(EState *estate)
Definition: execTuples.c:852
Datum * ecxt_aggvalues
Definition: execnodes.h:214
struct WindowStatePerAggData * WindowStatePerAgg
Definition: execnodes.h:1863
void ExecInitScanTupleSlot(EState *estate, ScanState *scanstate)
Definition: execTuples.c:842
bool equal(const void *a, const void *b)
Definition: equalfuncs.c:2984
Oid GetUserId(void)
Definition: miscinit.c:284
ScanState ss
Definition: execnodes.h:1867
ExprContext * ps_ExprContext
Definition: execnodes.h:884
Definition: nodes.h:512
TupleTableSlot * ss_ScanTupleSlot
Definition: execnodes.h:1116
struct WindowStatePerFuncData * WindowStatePerFunc
Definition: execnodes.h:1862
FmgrInfo * partEqfunctions
Definition: execnodes.h:1876
WindowFuncExprState * wfuncstate
Definition: nodeWindowAgg.c:79
bool contain_volatile_functions(Node *clause)
Definition: clauses.c:957
EState * state
Definition: execnodes.h:852
Index winref
Definition: primnodes.h:361
TupleTableSlot * temp_slot_1
Definition: execnodes.h:1916
WindowStatePerFunc perfunc
Definition: execnodes.h:1874
Oid * ordOperators
Definition: plannodes.h:809
void ExecAssignResultTypeFromTL(PlanState *planstate)
Definition: execUtils.c:448
TupleTableSlot * first_part_slot
Definition: execnodes.h:1911
ExprContext * tmpcontext
Definition: execnodes.h:1898
PlanState ps
Definition: execnodes.h:1113
struct WindowObjectData * agg_winobj
Definition: execnodes.h:1885
Node * startOffset
Definition: plannodes.h:811
static WindowStatePerAggData * initialize_peragg(WindowAggState *winstate, WindowFunc *wfunc, WindowStatePerAgg peraggstate)
#define ERROR
Definition: elog.h:43
char * get_func_name(Oid funcid)
Definition: lsyscache.c:1412
void ExecInitResultTupleSlot(EState *estate, PlanState *planstate)
Definition: execTuples.c:832
#define ALLOCSET_DEFAULT_SIZES
Definition: memutils.h:170
#define EXEC_FLAG_BACKWARD
Definition: executor.h:60
#define outerPlanState(node)
Definition: execnodes.h:896
TupleTableSlot * temp_slot_2
Definition: execnodes.h:1917
WindowStatePerAgg peragg
Definition: execnodes.h:1875
ExprState * startOffset
Definition: execnodes.h:1890
void ExecAssignProjectionInfo(PlanState *planstate, TupleDesc inputDesc)
Definition: execUtils.c:495
void aclcheck_error(AclResult aclerr, AclObjectKind objectkind, const char *objectname)
Definition: aclchk.c:3457
Node * endOffset
Definition: plannodes.h:812
#define fmgr_info_set_expr(expr, finfo)
Definition: fmgr.h:104
int partNumCols
Definition: plannodes.h:804
MemoryContext CurrentMemoryContext
Definition: mcxt.c:37
MemoryContext aggcontext
Definition: execnodes.h:1896
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
Definition: fmgr.c:132
#define InvokeFunctionExecuteHook(objectId)
Definition: objectaccess.h:179
#define outerPlan(node)
Definition: plannodes.h:174
TupleDesc tts_tupleDescriptor
Definition: tuptable.h:121
bool * ecxt_aggnulls
Definition: execnodes.h:215
static TupleTableSlot * ExecWindowAgg(PlanState *pstate)
WindowAggState * winstate
Definition: nodeWindowAgg.c:63
MemoryContext AllocSetContextCreate(MemoryContext parent, const char *name, Size minContextSize, Size initBlockSize, Size maxBlockSize)
Definition: aset.c:342
void * palloc0(Size size)
Definition: mcxt.c:877
ExecProcNodeMtd ExecProcNode
Definition: execnodes.h:856
AclResult
Definition: acl.h:178
uintptr_t Datum
Definition: postgres.h:372
void ExecSetSlotDescriptor(TupleTableSlot *slot, TupleDesc tupdesc)
Definition: execTuples.c:247
TupleTableSlot * agg_row_slot
Definition: execnodes.h:1915
Plan * plan
Definition: execnodes.h:850
bool more_partitions
Definition: execnodes.h:1904
FmgrInfo * ordEqfunctions
Definition: execnodes.h:1877
Oid * partOperators
Definition: plannodes.h:806
#define makeNode(_type_)
Definition: nodes.h:560
#define Assert(condition)
Definition: c.h:670
#define lfirst(lc)
Definition: pg_list.h:106
Index winref
Definition: plannodes.h:803
#define EXEC_FLAG_MARK
Definition: executor.h:61
void ExecAssignExprContext(EState *estate, PlanState *planstate)
Definition: execUtils.c:426
static int list_length(const List *l)
Definition: pg_list.h:89
void get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval)
Definition: lsyscache.c:2020
MemoryContext ecxt_per_query_memory
Definition: execnodes.h:203
ExprState * qual
Definition: execnodes.h:868
bool partition_spooled
Definition: execnodes.h:1902
void ExecAssignScanTypeFromOuterPlan(ScanState *scanstate)
Definition: execUtils.c:639
#define ACL_EXECUTE
Definition: parsenodes.h:79
AclResult pg_proc_aclcheck(Oid proc_oid, Oid roleid, AclMode mode)
Definition: aclchk.c:4504
int i
Plan plan
Definition: plannodes.h:802
MemoryContext partcontext
Definition: execnodes.h:1895
ExprState * ExecInitExpr(Expr *node, PlanState *parent)
Definition: execExpr.c:113
#define elog
Definition: elog.h:219
int frameOptions
Definition: plannodes.h:810
WindowFunc * wfunc
Definition: execnodes.h:671
FmgrInfo * execTuplesMatchPrepare(int numCols, Oid *eqOperators)
Definition: execGrouping.c:204
PlanState * ExecInitNode(Plan *node, EState *estate, int eflags)
Definition: execProcnode.c:139

◆ ExecReScanWindowAgg()

void ExecReScanWindowAgg ( WindowAggState node)

Definition at line 2054 of file nodeWindowAgg.c.

References WindowAggState::agg_row_slot, WindowAggState::all_done, WindowAggState::all_first, PlanState::chgParam, ExprContext::ecxt_aggnulls, ExprContext::ecxt_aggvalues, ExecClearTuple(), ExecReScan(), WindowAggState::first_part_slot, MemSet, WindowAggState::numfuncs, outerPlan, outerPlanState, ScanState::ps, PlanState::ps_ExprContext, release_partition(), WindowAggState::ss, ScanState::ss_ScanTupleSlot, WindowAggState::temp_slot_1, and WindowAggState::temp_slot_2.

Referenced by ExecReScan().

2055 {
2057  ExprContext *econtext = node->ss.ps.ps_ExprContext;
2058 
2059  node->all_done = false;
2060  node->all_first = true;
2061 
2062  /* release tuplestore et al */
2063  release_partition(node);
2064 
2065  /* release all temp tuples, but especially first_part_slot */
2069  ExecClearTuple(node->temp_slot_1);
2070  ExecClearTuple(node->temp_slot_2);
2071 
2072  /* Forget current wfunc values */
2073  MemSet(econtext->ecxt_aggvalues, 0, sizeof(Datum) * node->numfuncs);
2074  MemSet(econtext->ecxt_aggnulls, 0, sizeof(bool) * node->numfuncs);
2075 
2076  /*
2077  * if chgParam of subnode is not null then plan will be re-scanned by
2078  * first ExecProcNode.
2079  */
2080  if (outerPlan->chgParam == NULL)
2081  ExecReScan(outerPlan);
2082 }
Datum * ecxt_aggvalues
Definition: execnodes.h:214
ScanState ss
Definition: execnodes.h:1867
ExprContext * ps_ExprContext
Definition: execnodes.h:884
void ExecReScan(PlanState *node)
Definition: execAmi.c:76
TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
Definition: execTuples.c:439
#define MemSet(start, val, len)
Definition: c.h:853
TupleTableSlot * ss_ScanTupleSlot
Definition: execnodes.h:1116
static void release_partition(WindowAggState *winstate)
TupleTableSlot * temp_slot_1
Definition: execnodes.h:1916
TupleTableSlot * first_part_slot
Definition: execnodes.h:1911
PlanState ps
Definition: execnodes.h:1113
#define outerPlanState(node)
Definition: execnodes.h:896
TupleTableSlot * temp_slot_2
Definition: execnodes.h:1917
Bitmapset * chgParam
Definition: execnodes.h:878
#define outerPlan(node)
Definition: plannodes.h:174
bool * ecxt_aggnulls
Definition: execnodes.h:215
uintptr_t Datum
Definition: postgres.h:372
TupleTableSlot * agg_row_slot
Definition: execnodes.h:1915