OSDN Git Service

Don't try to constant-fold functions returning RECORD, since the optimizer
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 14 Apr 2005 21:44:09 +0000 (21:44 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 14 Apr 2005 21:44:09 +0000 (21:44 +0000)
isn't presently set up to pass them an expected tuple descriptor.  Bug has
been there since 7.3 but was just recently reported by Thomas Hallgren.

src/backend/optimizer/util/clauses.c

index 926162d..c528865 100644 (file)
@@ -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"
@@ -2104,6 +2105,16 @@ evaluate_function(Oid funcid, Oid result_type, List *args,
                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.
         */
        foreach(arg, args)