summaryrefslogtreecommitdiff
path: root/src/backend/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/adt/ruleutils.c28
-rw-r--r--src/backend/utils/cache/fcache.c34
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