Need to special-case RECORD as well as UNKNOWN in plpgsql's casting logic.
This is because can_coerce_type thinks that RECORD can be cast to any composite type, but coerce_record_to_complex only works for inputs that are RowExprs or whole-row Vars, so we get a hard failure on a CaseTestExpr. Perhaps these corner cases ought to be fixed so that coerce_to_target_type actually returns NULL as per its specification, rather than failing ... but for the moment an extra check here is the path of least resistance.
This commit is contained in:
parent
1345cc67bb
commit
45f2c2fc4e
@ -5829,17 +5829,18 @@ get_cast_expression(PLpgSQL_execstate *estate,
|
||||
*
|
||||
* If source type is UNKNOWN, coerce_to_target_type will fail (it only
|
||||
* expects to see that for Const input nodes), so don't call it; we'll
|
||||
* apply CoerceViaIO instead.
|
||||
* apply CoerceViaIO instead. Likewise, it doesn't currently work for
|
||||
* coercing RECORD to some other type, so skip for that too.
|
||||
*/
|
||||
if (srctype != UNKNOWNOID)
|
||||
if (srctype == UNKNOWNOID || srctype == RECORDOID)
|
||||
cast_expr = NULL;
|
||||
else
|
||||
cast_expr = coerce_to_target_type(NULL,
|
||||
(Node *) placeholder, srctype,
|
||||
dsttype, dsttypmod,
|
||||
COERCION_ASSIGNMENT,
|
||||
COERCE_IMPLICIT_CAST,
|
||||
-1);
|
||||
else
|
||||
cast_expr = NULL;
|
||||
|
||||
/*
|
||||
* If there's no cast path according to the parser, fall back to using an
|
||||
|
Loading…
x
Reference in New Issue
Block a user