*** ./src/backend/parser/parse_func.c.orig	2009-03-30 13:16:13.000000000 +0200
--- ./src/backend/parser/parse_func.c	2009-03-30 14:15:13.000000000 +0200
***************
*** 284,294 ****
  	/* perform the necessary typecasting of arguments */
  	make_fn_arguments(pstate, fargs, actual_arg_types, declared_arg_types);
  
  	/*
  	 * If it's a variadic function call, transform the last nvargs arguments
  	 * into an array --- unless it's an "any" variadic.
  	 */
! 	if (nvargs > 0 && declared_arg_types[nargs - 1] != ANYOID)
  	{
  		ArrayExpr *newa = makeNode(ArrayExpr);
  		int 	non_var_args = nargs - nvargs;
--- 284,316 ----
  	/* perform the necessary typecasting of arguments */
  	make_fn_arguments(pstate, fargs, actual_arg_types, declared_arg_types);
  
+ 	/* 
+ 	 * When function call is variadic and arg type is ANY, then transform 
+ 	 * array to standard list of arguments.
+ 	 */
+ 	if (func_variadic && declared_arg_types[nargs - 1] == ANYOID)
+ 	{
+ 		ArrayExpr *aexpr = (ArrayExpr *) llast(fargs);
+ 		if (!IsA(aexpr, ArrayExpr))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 					 errmsg("variadic parameter should be any array type"),
+ 					 parser_errposition(pstate, exprLocation((Node *) aexpr))));
+ 		
+ 		if (aexpr->multidims)
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_DATATYPE_MISMATCH),
+ 					 errmsg("multidimensional variadic arguments are not supported yet"),
+ 					 parser_errposition(pstate, exprLocation((Node *) aexpr))));
+ 		
+ 		fargs = list_truncate(fargs, nargs - 1);
+ 		fargs = list_concat(fargs, aexpr->elements);
+ 	}
  	/*
  	 * If it's a variadic function call, transform the last nvargs arguments
  	 * into an array --- unless it's an "any" variadic.
  	 */
! 	else if (nvargs > 0 && declared_arg_types[nargs - 1] != ANYOID)
  	{
  		ArrayExpr *newa = makeNode(ArrayExpr);
  		int 	non_var_args = nargs - nvargs;
