Re: BUG #3494: may be Query Error: subplan does not executed - Mailing list pgsql-bugs

From Heikki Linnakangas
Subject Re: BUG #3494: may be Query Error: subplan does not executed
Date
Msg-id 46AEFC76.4050001@enterprisedb.com
Whole thread Raw
In response to Re: BUG #3494: may be Query Error: subplan does not executed  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: BUG #3494: may be Query Error: subplan does not executed
List pgsql-bugs
Tom Lane wrote:
> It appears that join_clause_is_redundant() is rejecting the clause as
> redundant.  I suppose some part of that machinery gets confused by the
> fact that the RHS of the clause references both relations.  The
> EquivalenceClass rewrite cleaned this whole area up greatly, so no
> surprise that the bug is gone in HEAD.  No time to look at it more now.

Yeah, that's it.

I don't understand that code very well. Why does it think that the right
pathkeys of "test1.id = test2.id" and "test1.id = test1.id+test2.id" are
equal?

Checking for overlapping left and right relation sets in
join_clause_is_redundant seems to fix the problem, though I'm not sure
if there's some other cases that that doesn't catch.

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com
Index: src/backend/optimizer/util/restrictinfo.c
===================================================================
RCS file: /home/hlinnaka/pgcvsrepository/pgsql/src/backend/optimizer/util/restrictinfo.c,v
retrieving revision 1.49
diff -c -r1.49 restrictinfo.c
*** src/backend/optimizer/util/restrictinfo.c    4 Oct 2006 00:29:55 -0000    1.49
--- src/backend/optimizer/util/restrictinfo.c    31 Jul 2007 08:58:40 -0000
***************
*** 651,656 ****
--- 651,659 ----
   * of the latter, even though they might seem redundant by the pathkey
   * membership test.
   *
+  * The above logic only works for normal join clauses with non-overlapping
+  * left and right relation sets.
+  *
   * Weird special case: if we have two clauses that seem redundant
   * except one is pushed down into an outer join and the other isn't,
   * then they're not really redundant, because one constrains the
***************
*** 673,685 ****
              return refrinfo;
      }

!     /* check for redundant merge clauses */
!     if (rinfo->mergejoinoperator != InvalidOid)
      {
-         /* do the cheap test first: is it a "var = const" clause? */
-         if (bms_is_empty(rinfo->left_relids) ||
-             bms_is_empty(rinfo->right_relids))
-             return NULL;        /* var = const, so not redundant */

          cache_mergeclause_pathkeys(root, rinfo);

--- 676,689 ----
              return refrinfo;
      }

!     /*
!      * check for redundant merge clauses by comparing the pathkeys as
!      * explained above. The check for can_join handles the special case
!      * of "var = const", as well as any clauses with overlapping left
!      * and right rel sets.
!      */
!     if (rinfo->mergejoinoperator != InvalidOid && rinfo->can_join)
      {

          cache_mergeclause_pathkeys(root, rinfo);

***************
*** 687,693 ****
          {
              RestrictInfo *refrinfo = (RestrictInfo *) lfirst(refitem);

!             if (refrinfo->mergejoinoperator != InvalidOid)
              {
                  cache_mergeclause_pathkeys(root, refrinfo);

--- 691,697 ----
          {
              RestrictInfo *refrinfo = (RestrictInfo *) lfirst(refitem);

!             if (refrinfo->mergejoinoperator != InvalidOid && refrinfo->can_join)
              {
                  cache_mergeclause_pathkeys(root, refrinfo);


pgsql-bugs by date:

Previous
From: Decibel!
Date:
Subject: Re: BUG #3488: exporting data
Next
From: Marc Schablewski
Date:
Subject: Re: BUG #3484: Missing pg_clog file / corrupt index