Re: Except all eliminates what it shouldnt - Mailing list pgsql-bugs

From Tom Lane
Subject Re: Except all eliminates what it shouldnt
Date
Msg-id 19252.997809360@sss.pgh.pa.us
Whole thread Raw
In response to Except all eliminates what it shouldnt  (pgsql-bugs@postgresql.org)
List pgsql-bugs
pgsql-bugs@postgresql.org writes:
> Except all eliminates what it shouldnt

Hmm, nasty.  It looks like all nested cases of INTERSECT/EXCEPT are
broken.

Attached is a patch I've applied to CVS sources (7.2-to-be).  I don't
have enough confidence in it to back-patch it into 7.1.* right now,
but if you want to apply it locally I think it will work for you.

            regards, tom lane


*** src/backend/optimizer/prep/prepunion.c.orig    Tue Jun  5 01:26:04 2001
--- src/backend/optimizer/prep/prepunion.c    Tue Aug 14 12:55:33 2001
***************
*** 275,286 ****
       *
       * The tlist for an Append plan isn't important as far as the Append is
       * concerned, but we must make it look real anyway for the benefit of
!      * the next plan level up.
       */
      plan = (Plan *)
          make_append(makeList2(lplan, rplan),
                      false,
!                     generate_setop_tlist(op->colTypes, 0, false,
                                           lplan->targetlist,
                                           refnames_tlist));

--- 275,288 ----
       *
       * The tlist for an Append plan isn't important as far as the Append is
       * concerned, but we must make it look real anyway for the benefit of
!      * the next plan level up.  In fact, it has to be real enough that the
!      * flag column is shown as a variable not a constant, else setrefs.c
!      * will get confused.
       */
      plan = (Plan *)
          make_append(makeList2(lplan, rplan),
                      false,
!                     generate_setop_tlist(op->colTypes, 2, false,
                                           lplan->targetlist,
                                           refnames_tlist));

***************
*** 353,358 ****
--- 355,367 ----

  /*
   * Generate targetlist for a set-operation plan node
+  *
+  * colTypes: column datatypes for non-junk columns
+  * flag: -1 if no flag column needed, 0 or 1 to create a const flag column,
+  *       2 to create a variable flag column
+  * hack_constants: true to copy up constants (see comments in code)
+  * input_tlist: targetlist of this node's input node
+  * refnames_tlist: targetlist to take column names from
   */
  static List *
  generate_setop_tlist(List *colTypes, int flag,
***************
*** 414,432 ****

      if (flag >= 0)
      {
!         /* Add a resjunk column yielding specified flag value */
          resdom = makeResdom((AttrNumber) resno++,
                              INT4OID,
                              -1,
                              pstrdup("flag"),
                              true);
!         expr = (Node *) makeConst(INT4OID,
!                                   sizeof(int4),
!                                   Int32GetDatum(flag),
!                                   false,
!                                   true,
!                                   false,
!                                   false);
          tlist = lappend(tlist, makeTargetEntry(resdom, expr));
      }

--- 423,454 ----

      if (flag >= 0)
      {
!         /* Add a resjunk flag column */
          resdom = makeResdom((AttrNumber) resno++,
                              INT4OID,
                              -1,
                              pstrdup("flag"),
                              true);
!         if (flag <= 1)
!         {
!             /* flag value is the given constant */
!             expr = (Node *) makeConst(INT4OID,
!                                       sizeof(int4),
!                                       Int32GetDatum(flag),
!                                       false,
!                                       true,
!                                       false,
!                                       false);
!         }
!         else
!         {
!             /* flag value is being copied up from subplan */
!             expr = (Node *) makeVar(0,
!                                     resdom->resno,
!                                     INT4OID,
!                                     -1,
!                                     0);
!         }
          tlist = lappend(tlist, makeTargetEntry(resdom, expr));
      }

pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: WAL couse die my database?
Next
From: Tom Lane
Date:
Subject: Re: -ltermcap needed for psql client build on OpenBSD 2.9