From: Tom Lane Date: Mon, 26 Nov 2001 21:15:14 +0000 (+0000) Subject: Change display of FieldSelect nodes from arg.field to field(arg), X-Git-Tag: REL7_2_BETA4~154 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2337780e0e17a9d7e7caf72a69440e1e6c7abe4b;p=postgresql Change display of FieldSelect nodes from arg.field to field(arg), per bug report from Stefan Hadjistoytchev. There are some cases where the dot notation works, but there are more where it doesn't. Eventually ought to consider fixing the parser to allow cases like func().field, but for now this is the simplest patch. --- diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 421c6a828c..27abf6ace5 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -3,7 +3,7 @@ * back to source text * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.88 2001/11/26 00:29:15 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.89 2001/11/26 21:15:14 tgl Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -1866,28 +1866,36 @@ get_rule_expr(Node *node, deparse_context *context) case T_FieldSelect: { FieldSelect *fselect = (FieldSelect *) node; + Oid argType = exprType(fselect->arg); HeapTuple typetup; Form_pg_type typeStruct; Oid typrelid; char *fieldname; - /* we do NOT parenthesize the arg expression, for now */ - get_rule_expr(fselect->arg, context); + /* lookup arg type and get the field name */ typetup = SearchSysCache(TYPEOID, - ObjectIdGetDatum(exprType(fselect->arg)), + ObjectIdGetDatum(argType), 0, 0, 0); if (!HeapTupleIsValid(typetup)) elog(ERROR, "cache lookup of type %u failed", - exprType(fselect->arg)); + argType); typeStruct = (Form_pg_type) GETSTRUCT(typetup); typrelid = typeStruct->typrelid; if (!OidIsValid(typrelid)) elog(ERROR, "Argument type %s of FieldSelect is not a tuple type", - NameStr(typeStruct->typname)); + format_type_be(argType)); + ReleaseSysCache(typetup); fieldname = get_relid_attribute_name(typrelid, fselect->fieldnum); - appendStringInfo(buf, ".%s", quote_identifier(fieldname)); - ReleaseSysCache(typetup); + /* + * If the argument is simple enough, we could emit + * arg.fieldname, but most cases where FieldSelect is used + * are *not* simple. For now, always use the projection- + * function syntax. + */ + appendStringInfo(buf, "%s(", quote_identifier(fieldname)); + get_rule_expr(fselect->arg, context); + appendStringInfoChar(buf, ')'); } break;