Skip site navigation (1) Skip section navigation (2)

Re: Except all eliminates what it shouldnt

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: gerzson(at)elender(dot)hu, pgsql-bugs(at)postgresql(dot)org
Subject: Re: Except all eliminates what it shouldnt
Date: 2001-08-14 17:16:00
Message-ID: 19252.997809360@sss.pgh.pa.us (view raw or flat)
Thread:
Lists: pgsql-bugs
pgsql-bugs(at)postgresql(dot)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));
  	}
  

In response to

pgsql-bugs by date

Next:From: Tom LaneDate: 2001-08-14 17:31:40
Subject: Re: BUG!!! or not?
Previous:From: Stephan SzaboDate: 2001-08-14 16:18:02
Subject: Re: [BUGS] triggers

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group