*** pgsql/src/backend/parser/parse_func.c 2008/09/01 20:42:44 1.207 --- pgsql/src/backend/parser/parse_func.c 2008/12/04 17:51:26 1.208 *************** *** 8,14 **** * * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.206 2008/08/28 23:09:47 tgl Exp $ * *------------------------------------------------------------------------- */ --- 8,14 ---- * * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.207 2008/09/01 20:42:44 tgl Exp $ * *------------------------------------------------------------------------- */ *************** ParseFuncOrColumn(ParseState *pstate, Li *** 77,82 **** --- 77,83 ---- bool retset; int nvargs; FuncDetailCode fdresult; + List *argdefaults; /* * Most of the rest of the parser just assumes that functions do not have *************** ParseFuncOrColumn(ParseState *pstate, Li *** 164,170 **** fdresult = func_get_detail(funcname, fargs, nargs, actual_arg_types, !func_variadic, &funcid, &rettype, &retset, &nvargs, ! &declared_arg_types); if (fdresult == FUNCDETAIL_COERCION) { /* --- 165,171 ---- fdresult = func_get_detail(funcname, fargs, nargs, actual_arg_types, !func_variadic, &funcid, &rettype, &retset, &nvargs, ! &declared_arg_types, &argdefaults); if (fdresult == FUNCDETAIL_COERCION) { /* *************** ParseFuncOrColumn(ParseState *pstate, Li *** 234,239 **** --- 235,255 ---- parser_errposition(pstate, location))); } + /* add stored expressions as called values for arguments with defaults */ + if (argdefaults) + { + ListCell *lc; + + foreach(lc, argdefaults) + { + Node *expr = (Node *) lfirst(lc); + + fargs = lappend(fargs, expr); + actual_arg_types[nargs++] = exprType(expr); + } + } + + /* * enforce consistency with polymorphic argument and return types, * possibly adjusting return type or declared_arg_types (which will be *************** func_get_detail(List *funcname, *** 729,735 **** Oid *rettype, /* return value */ bool *retset, /* return value */ int *nvargs, /* return value */ ! Oid **true_typeids) /* return value */ { FuncCandidateList raw_candidates; FuncCandidateList best_candidate; --- 745,752 ---- Oid *rettype, /* return value */ bool *retset, /* return value */ int *nvargs, /* return value */ ! Oid **true_typeids, /* return value */ ! List **argdefaults) /* return value */ { FuncCandidateList raw_candidates; FuncCandidateList best_candidate; *************** func_get_detail(List *funcname, *** 870,875 **** --- 887,894 ---- *funcid = best_candidate->oid; *nvargs = best_candidate->nvargs; *true_typeids = best_candidate->args; + if (argdefaults) + *argdefaults = best_candidate->argdefaults; ftup = SearchSysCache(PROCOID, ObjectIdGetDatum(best_candidate->oid),