diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 926162d469cb6f6d2461c1c11fa1a3c6fcc03057..c52886575289f51a794d377ef426de99d71d0970 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.194 2005/04/10 20:57:32 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.195 2005/04/14 21:44:09 tgl Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -19,6 +19,7 @@
 
 #include "postgres.h"
 
+#include "access/heapam.h"
 #include "catalog/pg_aggregate.h"
 #include "catalog/pg_language.h"
 #include "catalog/pg_operator.h"
@@ -2103,6 +2104,16 @@ evaluate_function(Oid funcid, Oid result_type, List *args,
 	if (funcform->proretset)
 		return NULL;
 
+	/*
+	 * Can't simplify if it returns RECORD, except in the case where it has
+	 * OUT parameters, since it will be needing an expected tupdesc which we
+	 * can't supply here.
+	 */
+	if (funcform->prorettype == RECORDOID &&
+		(heap_attisnull(func_tuple, Anum_pg_proc_proallargtypes) ||
+		 heap_attisnull(func_tuple, Anum_pg_proc_proargmodes)))
+		return NULL;
+
 	/*
 	 * Check for constant inputs and especially constant-NULL inputs.
 	 */