mirror of
https://github.com/postgres/postgres.git
synced 2026-02-10 06:13:34 -05:00
The original specification for this called for the deserialization function to have signature "deserialize(serialtype) returns transtype", which is a security violation if transtype is INTERNAL (which it always would be in practice) and serialtype is not (which ditto). The patch blithely overrode the opr_sanity check for that, which was sloppy-enough work in itself, but the indisputable reason this cannot be allowed to stand is that CREATE FUNCTION will reject such a signature and thus it'd be impossible for extensions to create parallelizable aggregates. The minimum fix to make the signature type-safe is to add a second, dummy argument of type INTERNAL. But to lock it down a bit more and make misuse of INTERNAL-accepting functions less likely, let's get rid of the ability to specify a "serialtype" for an aggregate and just say that the only useful serialtype is BYTEA --- which, in practice, is the only interesting value anyway, due to the usefulness of the send/recv infrastructure for this purpose. That means we only have to allow "serialize(internal) returns bytea" and "deserialize(bytea, internal) returns internal" as the signatures for these support functions. In passing fix bogus signature of int4_avg_combine, which I found thanks to adding an opr_sanity check on combinefunc signatures. catversion bump due to removing pg_aggregate.aggserialtype and adjusting signatures of assorted built-in functions. David Rowley and Tom Lane Discussion: <27247.1466185504@sss.pgh.pa.us>
68 lines
2 KiB
C
68 lines
2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* parse_agg.h
|
|
* handle aggregates and window functions in parser
|
|
*
|
|
* Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/parser/parse_agg.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef PARSE_AGG_H
|
|
#define PARSE_AGG_H
|
|
|
|
#include "parser/parse_node.h"
|
|
|
|
extern void transformAggregateCall(ParseState *pstate, Aggref *agg,
|
|
List *args, List *aggorder,
|
|
bool agg_distinct);
|
|
|
|
extern Node *transformGroupingFunc(ParseState *pstate, GroupingFunc *g);
|
|
|
|
extern void transformWindowFuncCall(ParseState *pstate, WindowFunc *wfunc,
|
|
WindowDef *windef);
|
|
|
|
extern void parseCheckAggregates(ParseState *pstate, Query *qry);
|
|
|
|
extern List *expand_grouping_sets(List *groupingSets, int limit);
|
|
|
|
extern int get_aggregate_argtypes(Aggref *aggref, Oid *inputTypes);
|
|
|
|
extern Oid resolve_aggregate_transtype(Oid aggfuncid,
|
|
Oid aggtranstype,
|
|
Oid *inputTypes,
|
|
int numArguments);
|
|
|
|
extern void build_aggregate_transfn_expr(Oid *agg_input_types,
|
|
int agg_num_inputs,
|
|
int agg_num_direct_inputs,
|
|
bool agg_variadic,
|
|
Oid agg_state_type,
|
|
Oid agg_input_collation,
|
|
Oid transfn_oid,
|
|
Oid invtransfn_oid,
|
|
Expr **transfnexpr,
|
|
Expr **invtransfnexpr);
|
|
|
|
extern void build_aggregate_combinefn_expr(Oid agg_state_type,
|
|
Oid agg_input_collation,
|
|
Oid combinefn_oid,
|
|
Expr **combinefnexpr);
|
|
|
|
extern void build_aggregate_serialfn_expr(Oid serialfn_oid,
|
|
Expr **serialfnexpr);
|
|
|
|
extern void build_aggregate_deserialfn_expr(Oid deserialfn_oid,
|
|
Expr **deserialfnexpr);
|
|
|
|
extern void build_aggregate_finalfn_expr(Oid *agg_input_types,
|
|
int num_finalfn_inputs,
|
|
Oid agg_state_type,
|
|
Oid agg_result_type,
|
|
Oid agg_input_collation,
|
|
Oid finalfn_oid,
|
|
Expr **finalfnexpr);
|
|
|
|
#endif /* PARSE_AGG_H */
|