diff options
Diffstat (limited to 'src/backend/utils')
| -rw-r--r-- | src/backend/utils/adt/ruleutils.c | 28 | ||||
| -rw-r--r-- | src/backend/utils/cache/fcache.c | 34 |
2 files changed, 38 insertions, 24 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 502df7713d..6d4da07207 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; diff --git a/src/backend/utils/cache/fcache.c b/src/backend/utils/cache/fcache.c index ba34dfd03d..15ac990e31 100644 --- a/src/backend/utils/cache/fcache.c +++ b/src/backend/utils/cache/fcache.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/fcache.c,v 1.34 2000/07/12 02:37:20 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/fcache.c,v 1.35 2000/08/08 15:42:28 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -50,6 +50,9 @@ GetDynamicFuncArgType(Var *arg, ExprContext *econtext) elog(ERROR, "Lookup failed on type tuple for class %s", relname); + /* TEST: I bet this routine is unnecessary ... */ + Assert(arg->vartype == tup->t_data->t_oid); + return tup->t_data->t_oid; } @@ -116,22 +119,25 @@ init_fcache(Oid foid, { /* The return type is not a relation, so just use byval */ retval->typbyval = typeStruct->typbyval; + retval->returnsTuple = false; } else { /* * This is a hack. We assume here that any function returning a - * relation returns it by reference. This needs to be fixed. + * tuple returns it by reference. This needs to be fixed, since + * actually the mechanism isn't quite like return-by-reference. */ retval->typbyval = false; + retval->returnsTuple = true; } retval->foid = foid; retval->language = procedureStruct->prolang; + retval->returnsSet = procedureStruct->proretset; + retval->hasSetArg = false; retval->func_state = (char *) NULL; retval->setArg = (Datum) 0; - retval->hasSetArg = false; - retval->oneResult = !procedureStruct->proretset; /* * If we are returning exactly one result then we have to copy tuples @@ -140,12 +146,9 @@ init_fcache(Oid foid, * allocated by the executor (i.e. slots and tuples) is freed. */ if ((retval->language == SQLlanguageId) && - retval->oneResult && + !retval->returnsSet && !retval->typbyval) { - Form_pg_class relationStruct; - HeapTuple relationTuple; - TupleDesc td; TupleTableSlot *slot; slot = makeNode(TupleTableSlot); @@ -155,21 +158,6 @@ init_fcache(Oid foid, slot->ttc_buffer = InvalidBuffer; slot->ttc_whichplan = -1; - relationTuple = - SearchSysCacheTuple(RELNAME, - PointerGetDatum(&typeStruct->typname), - 0, 0, 0); - - if (relationTuple) - { - relationStruct = (Form_pg_class) GETSTRUCT(relationTuple); - td = CreateTemplateTupleDesc(relationStruct->relnatts); - } - else - td = CreateTemplateTupleDesc(1); - - slot->ttc_tupleDescriptor = td; - retval->funcSlot = (Pointer) slot; } else |
