Use a varno not chosen at random for dummy variables in the top-level
authorTom Lane
Tue, 11 Feb 2003 04:13:06 +0000 (04:13 +0000)
committerTom Lane
Tue, 11 Feb 2003 04:13:06 +0000 (04:13 +0000)
targetlist of a set-operation tree.  I'm not sure that this solution
will really stand the test of time --- perhaps we need to make a special
RTE for such vars to refer to.  But this quick hack fixes Brandon Craig
Rhodes' complaint of 10-Feb-02 about EXCEPT in CREATE RULE, while not
changing any behavior in the better-tested cases where leftmostRTI is
one anyway.

src/backend/parser/analyze.c

index fb3415ba03ca089af8ecf9dba4c80fa95307ddd9..f198ceb813f54bf6b3df5d4e5debc37583c6a7ca 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.261 2003/02/09 06:56:28 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.262 2003/02/11 04:13:06 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1786,6 +1786,11 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt)
     * leftmost select and common datatypes of topmost set operation. Also
     * make lists of the dummy vars and their names for use in parsing
     * ORDER BY.
+    *
+    * Note: we use leftmostRTI as the varno of the dummy variables.
+    * It shouldn't matter too much which RT index they have, as long
+    * as they have one that corresponds to a real RT entry; else funny
+    * things may happen when the tree is mashed by rule rewriting.
     */
    qry->targetList = NIL;
    targetvars = NIL;
@@ -1804,7 +1809,7 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt)
                            -1,
                            colName,
                            false);
-       expr = (Expr *) makeVar(1,
+       expr = (Expr *) makeVar(leftmostRTI,
                                leftResdom->resno,
                                colType,
                                -1,
@@ -1871,7 +1876,7 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt)
                                     NULL,
                                     true);
    jrtr = makeNode(RangeTblRef);
-   jrtr->rtindex = 1;
+   jrtr->rtindex = 1;          /* only entry in dummy rtable */
 
    sv_rtable = pstate->p_rtable;
    pstate->p_rtable = makeList1(jrte);