From: Tom Lane Date: Mon, 13 Jan 2003 00:18:51 +0000 (+0000) Subject: Recent changes in sublink representation require exprType() to accept X-Git-Tag: REL7_4_BETA1~1216 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d1686b42ab58ce29777557f52b941fa9b927b2a6;p=thirdparty%2Fpostgresql.git Recent changes in sublink representation require exprType() to accept SubPlan nodes, else explaining queries containing sublinks may fail. --- diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index adf45bbeef5..5ee64cf38ee 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.140 2003/01/10 21:08:15 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.141 2003/01/13 00:18:51 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -20,6 +20,7 @@ #include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/params.h" +#include "nodes/plannodes.h" #include "parser/analyze.h" #include "parser/gramparse.h" #include "parser/parse.h" @@ -962,6 +963,7 @@ exprType(Node *expr) elog(ERROR, "exprType: Cannot get type for untransformed sublink"); tent = (TargetEntry *) lfirst(qtree->targetList); Assert(IsA(tent, TargetEntry)); + Assert(!tent->resdom->resjunk); type = tent->resdom->restype; } else @@ -971,6 +973,32 @@ exprType(Node *expr) } } break; + case T_SubPlan: + { + /* + * Although the parser does not ever deal with already-planned + * expression trees, we support SubPlan nodes in this routine + * for the convenience of ruleutils.c. + */ + SubPlan *subplan = (SubPlan *) expr; + + if (subplan->subLinkType == EXPR_SUBLINK) + { + /* get the type of the subselect's first target column */ + TargetEntry *tent; + + tent = (TargetEntry *) lfirst(subplan->plan->targetlist); + Assert(IsA(tent, TargetEntry)); + Assert(!tent->resdom->resjunk); + type = tent->resdom->restype; + } + else + { + /* for all other subplan types, result is boolean */ + type = BOOLOID; + } + } + break; case T_FieldSelect: type = ((FieldSelect *) expr)->resulttype; break;