Remove no-longer-necessary restriction against uplevel correlation vars
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Mar 2000 07:38:30 +0000 (07:38 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Mar 2000 07:38:30 +0000 (07:38 +0000)
outside WHERE clause.  Fix a couple of places that didn't handle uplevel
refs cleanly.

src/backend/parser/parse_clause.c
src/backend/parser/parse_func.c
src/backend/parser/parse_relation.c

index 96a005ff0d919a29f17392f3de60928f00313d35..d2ceac82732a4dd6b3116966d7ca1a8863b018fc 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.57 2000/03/15 23:31:04 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.58 2000/03/23 07:38:30 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -74,10 +74,9 @@ void
 setTargetTable(ParseState *pstate, char *relname)
 {
    RangeTblEntry *rte;
-   int         sublevels_up;
 
-   if ((refnameRangeTablePosn(pstate, relname, &sublevels_up) == 0)
-       || (sublevels_up != 0))
+   /* look for relname only at current nesting level... */
+   if (refnameRangeTablePosn(pstate, relname, NULL) == 0)
        rte = addRangeTableEntry(pstate, relname,
                                 makeAttr(relname, NULL),
                                 FALSE, FALSE, FALSE);
index 7134d5e78119213ad0fe5b28f99ae776f02275a5..67d5aea77ad35a39005265c057ddb66e18cdb128 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.76 2000/03/19 00:19:39 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.77 2000/03/23 07:38:30 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -495,6 +495,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
        {
            RangeTblEntry *rte;
            int         vnum;
+           int         sublevels_up;
 
            /*
             * a relation
@@ -516,7 +517,8 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
 
            relname = rte->relname;
 
-           vnum = refnameRangeTablePosn(pstate, rte->eref->relname, NULL);
+           vnum = refnameRangeTablePosn(pstate, rte->eref->relname,
+                                        &sublevels_up);
 
            /*
             * for func(relname), the param to the function is the tuple
@@ -527,7 +529,7 @@ ParseFuncOrColumn(ParseState *pstate, char *funcname, List *fargs,
             */
            toid = typeTypeId(typenameType(relname));
            /* replace it in the arg list */
-           lfirst(i) = makeVar(vnum, 0, toid, -1, 0);
+           lfirst(i) = makeVar(vnum, 0, toid, -1, sublevels_up);
        }
        else if (!attisset)
        {
index 085cd5366bb5334ae2d9abedca63b04799be3adc..76c79de6c6d88c5ac49562f0b149e741823482c1 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.38 2000/03/17 02:36:17 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.39 2000/03/23 07:38:30 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -93,11 +93,7 @@ refnameRangeTableEntries(ParseState *pstate, char *refname)
            if (strcmp(rte->eref->relname, refname) == 0)
                rteList = lappend(rteList, rte);
        }
-       /* only allow correlated columns in WHERE clause */
-       if (pstate->p_in_where_clause)
-           pstate = pstate->parentParseState;
-       else
-           break;
+       pstate = pstate->parentParseState;
    }
    return rteList;
 }
@@ -117,16 +113,15 @@ refnameRangeTableEntry(ParseState *pstate, char *refname)
            if (strcmp(rte->eref->relname, refname) == 0)
                return rte;
        }
-       /* only allow correlated columns in WHERE clause */
-       if (pstate->p_in_where_clause)
-           pstate = pstate->parentParseState;
-       else
-           break;
+       pstate = pstate->parentParseState;
    }
    return NULL;
 }
 
-/* given refname, return id of variable; position starts with 1 */
+/* given refname, return RT index (starting with 1) of the relation,
+ * and optionally get its nesting depth (0 = current).  If sublevels_up
+ * is NULL, only consider rels at the current nesting level.
+ */
 int
 refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up)
 {
@@ -147,13 +142,9 @@ refnameRangeTablePosn(ParseState *pstate, char *refname, int *sublevels_up)
                return index;
            index++;
        }
-       /* only allow correlated columns in WHERE clause */
-       if (pstate->p_in_where_clause)
-       {
-           pstate = pstate->parentParseState;
-           if (sublevels_up)
-               (*sublevels_up)++;
-       }
+       pstate = pstate->parentParseState;
+       if (sublevels_up)
+           (*sublevels_up)++;
        else
            break;
    }
@@ -168,9 +159,8 @@ colnameRangeTableEntry(ParseState *pstate, char *colname)
 {
    List       *et;
    List       *rtable;
-   RangeTblEntry *rte_result;
+   RangeTblEntry *rte_result = NULL;
 
-   rte_result = NULL;
    while (pstate != NULL)
    {
        if (pstate->p_is_rule)
@@ -226,11 +216,10 @@ colnameRangeTableEntry(ParseState *pstate, char *colname)
                rte_result = rte;
        }
 
-       /* only allow correlated columns in WHERE clause */
-       if (pstate->p_in_where_clause && rte_result == NULL)
-           pstate = pstate->parentParseState;
-       else
-           break;
+       if (rte_result != NULL)
+           break;              /* found */
+
+       pstate = pstate->parentParseState;
    }
    return rte_result;
 }