diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2008-12-04 17:51:28 +0000 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2008-12-04 17:51:28 +0000 |
commit | 455dffbb73f9875c39f2ab544420454168a8c68c (patch) | |
tree | e440fabcfe1bf24cf0e44723aa329150af141ea2 /src/backend/utils/adt/ruleutils.c | |
parent | 7b640b0345dc4fbd39ff568700985b432f6afa07 (diff) | |
download | postgresql-455dffbb73f9875c39f2ab544420454168a8c68c.tar.gz postgresql-455dffbb73f9875c39f2ab544420454168a8c68c.zip |
Default values for function arguments
Pavel Stehule, with some tweaks by Peter Eisentraut
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 86 |
1 files changed, 78 insertions, 8 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 7a89bcb2dc1..afa19b384e7 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.287 2008/10/06 20:29:38 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.288 2008/12/04 17:51:27 petere Exp $ * *------------------------------------------------------------------------- */ @@ -141,7 +141,8 @@ static char *pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, static char *pg_get_expr_worker(text *expr, Oid relid, char *relname, int prettyFlags); static int print_function_arguments(StringInfo buf, HeapTuple proctup, - bool print_table_args); + bool print_table_args, + bool full); static void print_function_rettype(StringInfo buf, HeapTuple proctup); static void make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, int prettyFlags); @@ -1449,7 +1450,7 @@ pg_get_functiondef(PG_FUNCTION_ARGS) nsp = get_namespace_name(proc->pronamespace); appendStringInfo(&buf, "CREATE OR REPLACE FUNCTION %s(", quote_qualified_identifier(nsp, name)); - (void) print_function_arguments(&buf, proctup, false); + (void) print_function_arguments(&buf, proctup, false, true); appendStringInfoString(&buf, ")\n RETURNS "); print_function_rettype(&buf, proctup); appendStringInfo(&buf, "\n LANGUAGE %s\n", @@ -1598,7 +1599,7 @@ pg_get_function_arguments(PG_FUNCTION_ARGS) if (!HeapTupleIsValid(proctup)) elog(ERROR, "cache lookup failed for function %u", funcid); - (void) print_function_arguments(&buf, proctup, false); + (void) print_function_arguments(&buf, proctup, false, true); ReleaseSysCache(proctup); @@ -1606,6 +1607,36 @@ pg_get_function_arguments(PG_FUNCTION_ARGS) } /* + * pg_get_function_identity_arguments + * Get a formatted list of arguments for a function. + * This is everything that would go between the parentheses in + * ALTER FUNCTION, etc. skip names and defaults/ + */ +Datum +pg_get_function_identity_arguments(PG_FUNCTION_ARGS) +{ + Oid funcid = PG_GETARG_OID(0); + StringInfoData buf; + HeapTuple proctup; + + initStringInfo(&buf); + + proctup = SearchSysCache(PROCOID, + ObjectIdGetDatum(funcid), + 0, 0, 0); + if (!HeapTupleIsValid(proctup)) + elog(ERROR, "cache lookup failed for function %u", funcid); + + (void) print_function_arguments(&buf, proctup, false, false); + + ReleaseSysCache(proctup); + + PG_RETURN_TEXT_P(string_to_text(buf.data)); +} + + + +/* * pg_get_function_result * Get a nicely-formatted version of the result type of a function. * This is what would appear after RETURNS in CREATE FUNCTION. @@ -1649,7 +1680,7 @@ print_function_rettype(StringInfo buf, HeapTuple proctup) { /* It might be a table function; try to print the arguments */ appendStringInfoString(&rbuf, "TABLE("); - ntabargs = print_function_arguments(&rbuf, proctup, true); + ntabargs = print_function_arguments(&rbuf, proctup, true, true); if (ntabargs > 0) appendStringInfoString(&rbuf, ")"); else @@ -1672,10 +1703,12 @@ print_function_rettype(StringInfo buf, HeapTuple proctup) * append the desired subset of arguments to buf. We print only TABLE * arguments when print_table_args is true, and all the others when it's false. * Function return value is the number of arguments printed. + * When full is false, then don't print argument names and argument defaults. */ static int print_function_arguments(StringInfo buf, HeapTuple proctup, - bool print_table_args) + bool print_table_args, + bool full) { int numargs; Oid *argtypes; @@ -1683,10 +1716,37 @@ print_function_arguments(StringInfo buf, HeapTuple proctup, char *argmodes; int argsprinted; int i; + Datum proargdefaults; + List *argdefaults; + int nargdefaults; + bool isnull; + List *dcontext = NIL; numargs = get_func_arg_info(proctup, &argtypes, &argnames, &argmodes); + proargdefaults = SysCacheGetAttr(PROCOID, proctup, + Anum_pg_proc_proargdefaults, &isnull); + if (!isnull) + { + char *str; + + str = TextDatumGetCString(proargdefaults); + argdefaults = (List *) stringToNode(str); + Assert(IsA(argdefaults, List)); + nargdefaults = list_length(argdefaults); + + /* we will need deparse context */ + //dcontext = deparse_context_for("", InvalidOid); + dcontext = NULL; + pfree(str); + } + else + { + argdefaults = NIL; + nargdefaults = 0; + } + argsprinted = 0; for (i = 0; i < numargs; i++) { @@ -1723,9 +1783,19 @@ print_function_arguments(StringInfo buf, HeapTuple proctup, if (argsprinted) appendStringInfoString(buf, ", "); appendStringInfoString(buf, modename); - if (argname && argname[0]) + if (argname && argname[0] && full) appendStringInfo(buf, "%s ", argname); appendStringInfoString(buf, format_type_be(argtype)); + + /* search given default expression, expect less numargs */ + if (nargdefaults > 0 && i >= (numargs - nargdefaults) && full) + { + Node *expr; + + expr = (Node *) list_nth(argdefaults, i - (numargs - nargdefaults)); + appendStringInfo(buf, " DEFAULT %s", deparse_expression(expr, dcontext, false, false)); + } + argsprinted++; } @@ -6002,7 +6072,7 @@ generate_function_name(Oid funcid, int nargs, Oid *argtypes, p_result = func_get_detail(list_make1(makeString(proname)), NIL, nargs, argtypes, false, &p_funcid, &p_rettype, - &p_retset, &p_nvargs, &p_true_typeids); + &p_retset, &p_nvargs, &p_true_typeids, NULL); if ((p_result == FUNCDETAIL_NORMAL || p_result == FUNCDETAIL_AGGREGATE) && p_funcid == funcid) nspname = NULL; |