diff options
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 || |