diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index adf45bbeef..5ee64cf38e 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;