Department of second thoughts: probably shouldn't use nth() to get the
authorTom Lane
Sat, 22 Mar 2003 17:11:25 +0000 (17:11 +0000)
committerTom Lane
Sat, 22 Mar 2003 17:11:25 +0000 (17:11 +0000)
appropriate targetlist entry out of the subquery.  Use an explicit search
like we do everywhere else.

src/backend/optimizer/path/allpaths.c

index 0ee36240ab0d393938b040c247ec7654487b65d7..24f0ebf54dc605ac2e996121a1fb32c312d53613 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.100 2003/03/22 01:49:38 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.101 2003/03/22 17:11:25 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -638,7 +638,7 @@ qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual)
 {
    bool        safe = true;
    List       *vars;
-   List       *l;
+   List       *vl;
    Bitmapset  *tested = NULL;
 
    /* Refuse subselects (point 1) */
@@ -650,10 +650,11 @@ qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual)
     * all such Vars must refer to subselect output columns.
     */
    vars = pull_var_clause(qual, false);
-   foreach(l, vars)
+   foreach(vl, vars)
    {
-       Var    *var = (Var *) lfirst(l);
-       TargetEntry *tle;
+       Var    *var = (Var *) lfirst(vl);
+       List       *tl;
+       TargetEntry *tle = NULL;
 
        Assert(var->varno == rti);
        /*
@@ -665,8 +666,13 @@ qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual)
            continue;
        tested = bms_add_member(tested, var->varattno);
 
-       tle = (TargetEntry *) nth(var->varattno-1, subquery->targetList);
-       Assert(tle->resdom->resno == var->varattno);
+       foreach(tl, subquery->targetList)
+       {
+           tle = (TargetEntry *) lfirst(tl);
+           if (tle->resdom->resno == var->varattno)
+               break;
+       }
+       Assert(tl != NIL);
        Assert(!tle->resdom->resjunk);
 
        /* If subquery uses DISTINCT or DISTINCT ON, check point 2 */