]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Recent changes in sublink representation require exprType() to accept
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 13 Jan 2003 00:18:51 +0000 (00:18 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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;