Remove useless entries for aggregate functions from fmgrtab.c.
Gen_fmgrtab.pl treated aggregate functions the same as other built-in functions, which is wasteful because there is no real need to have entries for them in the fmgr_builtins[] table. Suppressing those entries saves about 3KB in the compiled table on my machine; which is not a lot but it's not nothing either, considering that that table is pretty "hot". The only outside code change needed is that ExecInitWindowAgg() can't be allowed to call fmgr_info_cxt() on a plain aggregate function. But that saves a few cycles anyway. Having done that, the aggregate_dummy() function is unreferenced and might as well be dropped. Using "aggregate_dummy" as the prosrc value for an aggregate is now just a documentation convention not something that matters. There was some discussion of using NULL instead to save a few bytes in pg_proc, but we'd have to remove prosrc's BKI_FORCE_NOT_NULL marking which doesn't seem a great idea. Anyway, it's possible there's client-side code that expects to see "aggregate_dummy" there, so I'm loath to change it without a strong reason. Discussion: https://postgr.es/m/533989.1604263665@sss.pgh.pa.us
This commit is contained in:
parent
113d3591b8
commit
f21636e5d5
@ -620,7 +620,7 @@ AggregateCreate(const char *aggName,
|
|||||||
GetUserId(), /* proowner */
|
GetUserId(), /* proowner */
|
||||||
INTERNALlanguageId, /* languageObjectId */
|
INTERNALlanguageId, /* languageObjectId */
|
||||||
InvalidOid, /* no validator */
|
InvalidOid, /* no validator */
|
||||||
"aggregate_dummy", /* placeholder proc */
|
"aggregate_dummy", /* placeholder (no such proc) */
|
||||||
NULL, /* probin */
|
NULL, /* probin */
|
||||||
PROKIND_AGGREGATE,
|
PROKIND_AGGREGATE,
|
||||||
false, /* security invoker (currently not
|
false, /* security invoker (currently not
|
||||||
|
@ -4935,24 +4935,6 @@ AggRegisterCallback(FunctionCallInfo fcinfo,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* aggregate_dummy - dummy execution routine for aggregate functions
|
|
||||||
*
|
|
||||||
* This function is listed as the implementation (prosrc field) of pg_proc
|
|
||||||
* entries for aggregate functions. Its only purpose is to throw an error
|
|
||||||
* if someone mistakenly executes such a function in the normal way.
|
|
||||||
*
|
|
||||||
* Perhaps someday we could assign real meaning to the prosrc field of
|
|
||||||
* an aggregate?
|
|
||||||
*/
|
|
||||||
Datum
|
|
||||||
aggregate_dummy(PG_FUNCTION_ARGS)
|
|
||||||
{
|
|
||||||
elog(ERROR, "aggregate function %u called as normal function",
|
|
||||||
fcinfo->flinfo->fn_oid);
|
|
||||||
return (Datum) 0; /* keep compiler quiet */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
* Parallel Query Support
|
* Parallel Query Support
|
||||||
* ----------------------------------------------------------------
|
* ----------------------------------------------------------------
|
||||||
|
@ -2446,11 +2446,6 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
|
|||||||
perfuncstate->wfuncstate = wfuncstate;
|
perfuncstate->wfuncstate = wfuncstate;
|
||||||
perfuncstate->wfunc = wfunc;
|
perfuncstate->wfunc = wfunc;
|
||||||
perfuncstate->numArguments = list_length(wfuncstate->args);
|
perfuncstate->numArguments = list_length(wfuncstate->args);
|
||||||
|
|
||||||
fmgr_info_cxt(wfunc->winfnoid, &perfuncstate->flinfo,
|
|
||||||
econtext->ecxt_per_query_memory);
|
|
||||||
fmgr_info_set_expr((Node *) wfunc, &perfuncstate->flinfo);
|
|
||||||
|
|
||||||
perfuncstate->winCollation = wfunc->inputcollid;
|
perfuncstate->winCollation = wfunc->inputcollid;
|
||||||
|
|
||||||
get_typlenbyval(wfunc->wintype,
|
get_typlenbyval(wfunc->wintype,
|
||||||
@ -2479,6 +2474,11 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
|
|||||||
winobj->argstates = wfuncstate->args;
|
winobj->argstates = wfuncstate->args;
|
||||||
winobj->localmem = NULL;
|
winobj->localmem = NULL;
|
||||||
perfuncstate->winobj = winobj;
|
perfuncstate->winobj = winobj;
|
||||||
|
|
||||||
|
/* It's a real window function, so set up to call it. */
|
||||||
|
fmgr_info_cxt(wfunc->winfnoid, &perfuncstate->flinfo,
|
||||||
|
econtext->ecxt_per_query_memory);
|
||||||
|
fmgr_info_set_expr((Node *) wfunc, &perfuncstate->flinfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,6 +75,7 @@ foreach my $row (@{ $catalog_data{pg_proc} })
|
|||||||
oid => $bki_values{oid},
|
oid => $bki_values{oid},
|
||||||
name => $bki_values{proname},
|
name => $bki_values{proname},
|
||||||
lang => $bki_values{prolang},
|
lang => $bki_values{prolang},
|
||||||
|
kind => $bki_values{prokind},
|
||||||
strict => $bki_values{proisstrict},
|
strict => $bki_values{proisstrict},
|
||||||
retset => $bki_values{proretset},
|
retset => $bki_values{proretset},
|
||||||
nargs => $bki_values{pronargs},
|
nargs => $bki_values{pronargs},
|
||||||
@ -195,8 +196,10 @@ foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
|
|||||||
$sqlname .= "_" . $s->{args} if ($proname_counts{ $s->{name} } > 1);
|
$sqlname .= "_" . $s->{args} if ($proname_counts{ $s->{name} } > 1);
|
||||||
$sqlname =~ s/\s+/_/g;
|
$sqlname =~ s/\s+/_/g;
|
||||||
print $ofh "#define F_" . uc $sqlname . " $s->{oid}\n";
|
print $ofh "#define F_" . uc $sqlname . " $s->{oid}\n";
|
||||||
# We want only one extern per internal-language function
|
# We want only one extern per internal-language, non-aggregate function
|
||||||
if ($s->{lang} eq 'internal' && !$seenit{ $s->{prosrc} })
|
if ( $s->{lang} eq 'internal'
|
||||||
|
&& $s->{kind} ne 'a'
|
||||||
|
&& !$seenit{ $s->{prosrc} })
|
||||||
{
|
{
|
||||||
$seenit{ $s->{prosrc} } = 1;
|
$seenit{ $s->{prosrc} } = 1;
|
||||||
print $pfh "extern Datum $s->{prosrc}(PG_FUNCTION_ARGS);\n";
|
print $pfh "extern Datum $s->{prosrc}(PG_FUNCTION_ARGS);\n";
|
||||||
@ -214,6 +217,8 @@ my $fmgr_count = 0;
|
|||||||
foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
|
foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
|
||||||
{
|
{
|
||||||
next if $s->{lang} ne 'internal';
|
next if $s->{lang} ne 'internal';
|
||||||
|
# We do not need entries for aggregate functions
|
||||||
|
next if $s->{kind} eq 'a';
|
||||||
|
|
||||||
print $tfh ",\n" if ($fmgr_count > 0);
|
print $tfh ",\n" if ($fmgr_count > 0);
|
||||||
print $tfh
|
print $tfh
|
||||||
|
Loading…
x
Reference in New Issue
Block a user