mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Don't try to constant-fold functions returning RECORD. We were never
able to do this before, but I had tried to make an exception for functions with OUT parameters. Michael Fuhr found one problem with it already, and I found another, which was it didn't work for strict functions with a NULL input. While both of these could be worked around, the probability that there are more gotchas seems high; I think prudence dictates just reverting to the former behavior for now. Accordingly, remove the kluge added to get_expr_result_type() for Michael's case.
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.199 2005/06/26 22:05:38 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.200 2005/07/03 21:14:17 tgl Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
@ -2200,13 +2200,17 @@ 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.
|
||||
* Can't simplify if it returns RECORD. The immediate problem is that
|
||||
* it will be needing an expected tupdesc which we can't supply here.
|
||||
*
|
||||
* In the case where it has OUT parameters, it could get by without an
|
||||
* expected tupdesc, but we still have issues: get_expr_result_type()
|
||||
* doesn't know how to extract type info from a RECORD constant, and
|
||||
* in the case of a NULL function result there doesn't seem to be any
|
||||
* clean way to fix that. In view of the likelihood of there being
|
||||
* still other gotchas, seems best to leave the function call unreduced.
|
||||
*/
|
||||
if (funcform->prorettype == RECORDOID &&
|
||||
(heap_attisnull(func_tuple, Anum_pg_proc_proallargtypes) ||
|
||||
heap_attisnull(func_tuple, Anum_pg_proc_proargmodes)))
|
||||
if (funcform->prorettype == RECORDOID)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user