aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_func.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2008-12-04 17:51:28 +0000
committerPeter Eisentraut <peter_e@gmx.net>2008-12-04 17:51:28 +0000
commit455dffbb73f9875c39f2ab544420454168a8c68c (patch)
treee440fabcfe1bf24cf0e44723aa329150af141ea2 /src/backend/parser/parse_func.c
parent7b640b0345dc4fbd39ff568700985b432f6afa07 (diff)
downloadpostgresql-455dffbb73f9875c39f2ab544420454168a8c68c.tar.gz
postgresql-455dffbb73f9875c39f2ab544420454168a8c68c.zip
Default values for function arguments
Pavel Stehule, with some tweaks by Peter Eisentraut
Diffstat (limited to 'src/backend/parser/parse_func.c')
-rw-r--r--src/backend/parser/parse_func.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c
index bbbc5fe7a94..1171d367c6f 100644
--- a/src/backend/parser/parse_func.c
+++ b/src/backend/parser/parse_func.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.207 2008/09/01 20:42:44 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.208 2008/12/04 17:51:26 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -77,6 +77,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
bool retset;
int nvargs;
FuncDetailCode fdresult;
+ List *argdefaults;
/*
* Most of the rest of the parser just assumes that functions do not have
@@ -164,7 +165,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
fdresult = func_get_detail(funcname, fargs, nargs, actual_arg_types,
!func_variadic,
&funcid, &rettype, &retset, &nvargs,
- &declared_arg_types);
+ &declared_arg_types, &argdefaults);
if (fdresult == FUNCDETAIL_COERCION)
{
/*
@@ -234,6 +235,21 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
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
@@ -729,7 +745,8 @@ func_get_detail(List *funcname,
Oid *rettype, /* return value */
bool *retset, /* return value */
int *nvargs, /* return value */
- Oid **true_typeids) /* return value */
+ Oid **true_typeids, /* return value */
+ List **argdefaults) /* return value */
{
FuncCandidateList raw_candidates;
FuncCandidateList best_candidate;
@@ -870,6 +887,8 @@ func_get_detail(List *funcname,
*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),