From 9da6d2c0e71a18cb3806ba6531d7aa233ab266ee Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 23 Mar 2000 07:32:58 +0000 Subject: [PATCH] ExecSubPlan needs to be able to cope with RelabelType nodes atop the Const placeholder nodes for subplan result values. --- src/backend/executor/nodeSubplan.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index d21a4478c4..ed09a0bc9f 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeSubplan.c,v 1.23 2000/03/21 04:20:45 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeSubplan.c,v 1.24 2000/03/23 07:32:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -141,16 +141,28 @@ ExecSubPlan(SubPlan *node, List *pvar, ExprContext *econtext, bool *isNull) /* * The righthand side of the expression should be either a Const - * or a function call taking a Const as arg (the function would - * be a run-time type coercion inserted by the parser to get to - * the input type needed by the operator). Find the Const node - * and insert the actual righthand side value into it. + * or a function call or RelabelType node taking a Const as arg + * (these nodes represent run-time type coercions inserted by + * the parser to get to the input type needed by the operator). + * Find the Const node and insert the actual righthand-side value + * into it. */ if (! IsA(con, Const)) { - Assert(IsA(con, Expr)); - con = lfirst(((Expr *) con)->args); - Assert(IsA(con, Const)); + switch (con->type) + { + case T_Expr: + con = lfirst(((Expr *) con)->args); + break; + case T_RelabelType: + con = (Const *) (((RelabelType *) con)->arg); + break; + default: + /* will fail below */ + break; + } + if (! IsA(con, Const)) + elog(ERROR, "ExecSubPlan: failed to find placeholder for subplan result"); } con->constvalue = heap_getattr(tup, col, tdesc, &(con->constisnull));