From 9da6d2c0e71a18cb3806ba6531d7aa233ab266ee Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
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 d21a4478c4c..ed09a0bc9f2 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));
-- 
GitLab