diff options
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 502df7713d6..6d4da07207a 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -3,7 +3,7 @@ * out of its tuple * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.57 2000/07/06 23:03:37 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.58 2000/08/08 15:42:21 tgl Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -1430,6 +1430,32 @@ get_rule_expr(Node *node, deparse_context *context) } break; + case T_FieldSelect: + { + FieldSelect *fselect = (FieldSelect *) node; + 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); + typetup = SearchSysCacheTuple(TYPEOID, + ObjectIdGetDatum(exprType(fselect->arg)), + 0, 0, 0); + if (!HeapTupleIsValid(typetup)) + elog(ERROR, "cache lookup of type %u failed", + exprType(fselect->arg)); + 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)); + fieldname = get_attribute_name(typrelid, fselect->fieldnum); + appendStringInfo(buf, ".%s", quote_identifier(fieldname)); + } + break; + case T_RelabelType: { RelabelType *relabel = (RelabelType *) node; |