*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.65 2001/06/05 05:26:04 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.66 2001/08/14 17:12:57 tgl Exp $
*
*-------------------------------------------------------------------------
*/
*
* 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.
+ * 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, 0, false,
+ generate_setop_tlist(op->colTypes, 2, false,
lplan->targetlist,
refnames_tlist));
/*
* 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,
if (flag >= 0)
{
- /* Add a resjunk column yielding specified flag value */
+ /* Add a resjunk flag column */
resdom = makeResdom((AttrNumber) resno++,
INT4OID,
-1,
pstrdup("flag"),
true);
- expr = (Node *) makeConst(INT4OID,
- sizeof(int4),
- Int32GetDatum(flag),
- false,
- true,
- false,
- false);
+ 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));
}