From 57b30e8e226014c8d06bae0158e0c7fc679f700b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 20 Feb 2000 21:32:16 +0000 Subject: Create a new expression node type RelabelType, which exists solely to represent the result of a binary-compatible type coercion. At runtime it just evaluates its argument --- but during type resolution, exprType will pick up the output type of the RelabelType node instead of the type of the argument. This solves some longstanding problems with dropped type coercions, an example being 'select now()::abstime::int4' which used to produce date-formatted output, not an integer, because the coercion to int4 was dropped on the floor. --- src/backend/nodes/copyfuncs.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/backend/nodes/copyfuncs.c') diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 5bf01e2272..fbef91b35d 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.106 2000/02/15 20:49:09 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.107 2000/02/20 21:32:05 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -873,6 +873,26 @@ _copySubLink(SubLink *from) return newnode; } +/* ---------------- + * _copyRelabelType + * ---------------- + */ +static RelabelType * +_copyRelabelType(RelabelType *from) +{ + RelabelType *newnode = makeNode(RelabelType); + + /* ---------------- + * copy remainder of node + * ---------------- + */ + Node_Copy(from, newnode, arg); + newnode->resulttype = from->resulttype; + newnode->resulttypmod = from->resulttypmod; + + return newnode; +} + /* ---------------- * _copyCaseExpr * ---------------- @@ -1617,6 +1637,9 @@ copyObject(void *from) case T_SubLink: retval = _copySubLink(from); break; + case T_RelabelType: + retval = _copyRelabelType(from); + break; case T_CaseExpr: retval = _copyCaseExpr(from); break; -- cgit v1.2.1