diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2009-10-08 02:39:25 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2009-10-08 02:39:25 +0000 |
commit | 717fa274d14d9cd25396b85bb92f567e1c623f0c (patch) | |
tree | 4fe298a9faa1fc8f038a9a1f35ee033abc3e41ed /src/backend/utils/adt/ruleutils.c | |
parent | 2eda8dfb52ed9962920282d8384da8bb4c22514d (diff) | |
download | postgresql-717fa274d14d9cd25396b85bb92f567e1c623f0c.tar.gz postgresql-717fa274d14d9cd25396b85bb92f567e1c623f0c.zip |
Support use of function argument names to identify which actual arguments
match which function parameters. The syntax uses AS, for example
funcname(value AS arg1, anothervalue AS arg2)
Pavel Stehule
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 63 |
1 files changed, 44 insertions, 19 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 38057a0bfdc..4c04bafd7c6 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.306 2009/08/01 19:59:41 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.307 2009/10/08 02:39:23 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -218,8 +218,8 @@ static Node *processIndirection(Node *node, deparse_context *context, bool printit); static void printSubscripts(ArrayRef *aref, deparse_context *context); static char *generate_relation_name(Oid relid, List *namespaces); -static char *generate_function_name(Oid funcid, int nargs, Oid *argtypes, - bool *is_variadic); +static char *generate_function_name(Oid funcid, int nargs, List *argnames, + Oid *argtypes, bool *is_variadic); static char *generate_operator_name(Oid operid, Oid arg1, Oid arg2); static text *string_to_text(char *str); static char *flatten_reloptions(Oid relid); @@ -558,7 +558,8 @@ pg_get_triggerdef(PG_FUNCTION_ARGS) appendStringInfo(&buf, "FOR EACH STATEMENT "); appendStringInfo(&buf, "EXECUTE PROCEDURE %s(", - generate_function_name(trigrec->tgfoid, 0, NULL, NULL)); + generate_function_name(trigrec->tgfoid, 0, + NIL, NULL, NULL)); if (trigrec->tgnargs > 0) { @@ -4324,6 +4325,15 @@ get_rule_expr(Node *node, deparse_context *context, get_func_expr((FuncExpr *) node, context, showimplicit); break; + case T_NamedArgExpr: + { + NamedArgExpr *na = (NamedArgExpr *) node; + + get_rule_expr((Node *) na->arg, context, showimplicit); + appendStringInfo(buf, " AS %s", quote_identifier(na->name)); + } + break; + case T_OpExpr: get_oper_expr((OpExpr *) node, context); break; @@ -5187,6 +5197,7 @@ get_func_expr(FuncExpr *expr, deparse_context *context, Oid funcoid = expr->funcid; Oid argtypes[FUNC_MAX_ARGS]; int nargs; + List *argnames; bool is_variadic; ListCell *l; @@ -5231,14 +5242,20 @@ get_func_expr(FuncExpr *expr, deparse_context *context, (errcode(ERRCODE_TOO_MANY_ARGUMENTS), errmsg("too many arguments"))); nargs = 0; + argnames = NIL; foreach(l, expr->args) { - argtypes[nargs] = exprType((Node *) lfirst(l)); + Node *arg = (Node *) lfirst(l); + + if (IsA(arg, NamedArgExpr)) + argnames = lappend(argnames, ((NamedArgExpr *) arg)->name); + argtypes[nargs] = exprType(arg); nargs++; } appendStringInfo(buf, "%s(", - generate_function_name(funcoid, nargs, argtypes, + generate_function_name(funcoid, nargs, + argnames, argtypes, &is_variadic)); nargs = 0; foreach(l, expr->args) @@ -5270,13 +5287,16 @@ get_agg_expr(Aggref *aggref, deparse_context *context) nargs = 0; foreach(l, aggref->args) { - argtypes[nargs] = exprType((Node *) lfirst(l)); + Node *arg = (Node *) lfirst(l); + + Assert(!IsA(arg, NamedArgExpr)); + argtypes[nargs] = exprType(arg); nargs++; } appendStringInfo(buf, "%s(%s", - generate_function_name(aggref->aggfnoid, - nargs, argtypes, NULL), + generate_function_name(aggref->aggfnoid, nargs, + NIL, argtypes, NULL), aggref->aggdistinct ? "DISTINCT " : ""); /* aggstar can be set only in zero-argument aggregates */ if (aggref->aggstar) @@ -5304,13 +5324,16 @@ get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context) nargs = 0; foreach(l, wfunc->args) { - argtypes[nargs] = exprType((Node *) lfirst(l)); + Node *arg = (Node *) lfirst(l); + + Assert(!IsA(arg, NamedArgExpr)); + argtypes[nargs] = exprType(arg); nargs++; } - appendStringInfo(buf, "%s(%s", - generate_function_name(wfunc->winfnoid, - nargs, argtypes, NULL), ""); + appendStringInfo(buf, "%s(", + generate_function_name(wfunc->winfnoid, nargs, + NIL, argtypes, NULL)); /* winstar can be set only in zero-argument aggregates */ if (wfunc->winstar) appendStringInfoChar(buf, '*'); @@ -6338,15 +6361,15 @@ generate_relation_name(Oid relid, List *namespaces) /* * generate_function_name * Compute the name to display for a function specified by OID, - * given that it is being called with the specified actual arg types. - * (Arg types matter because of ambiguous-function resolution rules.) + * given that it is being called with the specified actual arg names and + * types. (Those matter because of ambiguous-function resolution rules.) * * The result includes all necessary quoting and schema-prefixing. We can * also pass back an indication of whether the function is variadic. */ static char * -generate_function_name(Oid funcid, int nargs, Oid *argtypes, - bool *is_variadic) +generate_function_name(Oid funcid, int nargs, List *argnames, + Oid *argtypes, bool *is_variadic) { HeapTuple proctup; Form_pg_proc procform; @@ -6371,10 +6394,12 @@ generate_function_name(Oid funcid, int nargs, Oid *argtypes, /* * The idea here is to schema-qualify only if the parser would fail to * resolve the correct function given the unqualified func name with the - * specified argtypes. + * specified argtypes. If the function is variadic, we should presume + * that VARIADIC will be included in the call. */ p_result = func_get_detail(list_make1(makeString(proname)), - NIL, nargs, argtypes, false, true, + NIL, argnames, nargs, argtypes, + !OidIsValid(procform->provariadic), true, &p_funcid, &p_rettype, &p_retset, &p_nvargs, &p_true_typeids, NULL); if ((p_result == FUNCDETAIL_NORMAL || |