Recent changes in sublink representation require exprType() to accept
authorTom Lane
Mon, 13 Jan 2003 00:18:51 +0000 (00:18 +0000)
committerTom Lane
Mon, 13 Jan 2003 00:18:51 +0000 (00:18 +0000)
SubPlan nodes, else explaining queries containing sublinks may fail.

src/backend/parser/parse_expr.c

index adf45bbeef5acf6c27287b449b43db6bfc5390b7..5ee64cf38ee6af025c1c5cba2a264fba2f296488 100644 (file)
@@ -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;