create-aggregate-check-initcond.patch

text/x-patch

Filename: create-aggregate-check-initcond.patch
Type: text/x-patch
Part: 0
Message: Make CREATE AGGREGATE check validity of initcond value?

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/commands/aggregatecmds.c 0 0
diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c
index c99c07c..b9f8711 100644
*** a/src/backend/commands/aggregatecmds.c
--- b/src/backend/commands/aggregatecmds.c
*************** DefineAggregate(List *name, List *args,
*** 61,66 ****
--- 61,67 ----
  	Oid		   *aggArgTypes;
  	int			numArgs;
  	Oid			transTypeId;
+ 	char		transTypeType;
  	ListCell   *pl;
  
  	/* Convert list of names to a name and namespace */
*************** DefineAggregate(List *name, List *args,
*** 181,187 ****
  	 * aggregate.
  	 */
  	transTypeId = typenameTypeId(NULL, transType);
! 	if (get_typtype(transTypeId) == TYPTYPE_PSEUDO &&
  		!IsPolymorphicType(transTypeId))
  	{
  		if (transTypeId == INTERNALOID && superuser())
--- 182,189 ----
  	 * aggregate.
  	 */
  	transTypeId = typenameTypeId(NULL, transType);
! 	transTypeType = get_typtype(transTypeId);
! 	if (transTypeType == TYPTYPE_PSEUDO &&
  		!IsPolymorphicType(transTypeId))
  	{
  		if (transTypeId == INTERNALOID && superuser())
*************** DefineAggregate(List *name, List *args,
*** 194,199 ****
--- 196,219 ----
  	}
  
  	/*
+ 	 * If we have an initval, and it's not for a pseudotype (particularly a
+ 	 * polymorphic type), make sure it's acceptable to the type's input
+ 	 * function.  We will store the initval as text, because the input
+ 	 * function isn't necessarily immutable (consider "now" for timestamp),
+ 	 * and we want to use the runtime not creation-time interpretation of the
+ 	 * value.  However, if it's an incorrect value it seems much more
+ 	 * user-friendly to complain at CREATE AGGREGATE time.
+ 	 */
+ 	if (initval && transTypeType != TYPTYPE_PSEUDO)
+ 	{
+ 		Oid			typinput,
+ 					typioparam;
+ 
+ 		getTypeInputInfo(transTypeId, &typinput, &typioparam);
+ 		(void) OidInputFunctionCall(typinput, initval, typioparam, -1);
+ 	}
+ 
+ 	/*
  	 * Most of the argument-checking is done inside of AggregateCreate
  	 */
  	AggregateCreate(aggName,	/* aggregate name */