|
14 | 14 | *
|
15 | 15 | *
|
16 | 16 | * IDENTIFICATION
|
17 |
| - * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.65 2001/06/05 05:26:04 tgl Exp $ |
| 17 | + * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.66 2001/08/14 17:12:57 tgl Exp $ |
18 | 18 | *
|
19 | 19 | *-------------------------------------------------------------------------
|
20 | 20 | */
|
@@ -275,12 +275,14 @@ generate_nonunion_plan(SetOperationStmt *op, Query *parse,
|
275 | 275 | *
|
276 | 276 | * The tlist for an Append plan isn't important as far as the Append is
|
277 | 277 | * concerned, but we must make it look real anyway for the benefit of
|
278 |
| - * the next plan level up. |
| 278 | + * the next plan level up. In fact, it has to be real enough that the |
| 279 | + * flag column is shown as a variable not a constant, else setrefs.c |
| 280 | + * will get confused. |
279 | 281 | */
|
280 | 282 | plan = (Plan *)
|
281 | 283 | make_append(makeList2(lplan, rplan),
|
282 | 284 | false,
|
283 |
| - generate_setop_tlist(op->colTypes, 0, false, |
| 285 | + generate_setop_tlist(op->colTypes, 2, false, |
284 | 286 | lplan->targetlist,
|
285 | 287 | refnames_tlist));
|
286 | 288 |
|
@@ -353,6 +355,13 @@ recurse_union_children(Node *setOp, Query *parse,
|
353 | 355 |
|
354 | 356 | /*
|
355 | 357 | * Generate targetlist for a set-operation plan node
|
| 358 | + * |
| 359 | + * colTypes: column datatypes for non-junk columns |
| 360 | + * flag: -1 if no flag column needed, 0 or 1 to create a const flag column, |
| 361 | + * 2 to create a variable flag column |
| 362 | + * hack_constants: true to copy up constants (see comments in code) |
| 363 | + * input_tlist: targetlist of this node's input node |
| 364 | + * refnames_tlist: targetlist to take column names from |
356 | 365 | */
|
357 | 366 | static List *
|
358 | 367 | generate_setop_tlist(List *colTypes, int flag,
|
@@ -414,19 +423,32 @@ generate_setop_tlist(List *colTypes, int flag,
|
414 | 423 |
|
415 | 424 | if (flag >= 0)
|
416 | 425 | {
|
417 |
| - /* Add a resjunk column yielding specified flag value */ |
| 426 | + /* Add a resjunk flag column */ |
418 | 427 | resdom = makeResdom((AttrNumber) resno++,
|
419 | 428 | INT4OID,
|
420 | 429 | -1,
|
421 | 430 | pstrdup("flag"),
|
422 | 431 | true);
|
423 |
| - expr = (Node *) makeConst(INT4OID, |
424 |
| - sizeof(int4), |
425 |
| - Int32GetDatum(flag), |
426 |
| - false, |
427 |
| - true, |
428 |
| - false, |
429 |
| - false); |
| 432 | + if (flag <= 1) |
| 433 | + { |
| 434 | + /* flag value is the given constant */ |
| 435 | + expr = (Node *) makeConst(INT4OID, |
| 436 | + sizeof(int4), |
| 437 | + Int32GetDatum(flag), |
| 438 | + false, |
| 439 | + true, |
| 440 | + false, |
| 441 | + false); |
| 442 | + } |
| 443 | + else |
| 444 | + { |
| 445 | + /* flag value is being copied up from subplan */ |
| 446 | + expr = (Node *) makeVar(0, |
| 447 | + resdom->resno, |
| 448 | + INT4OID, |
| 449 | + -1, |
| 450 | + 0); |
| 451 | + } |
430 | 452 | tlist = lappend(tlist, makeTargetEntry(resdom, expr));
|
431 | 453 | }
|
432 | 454 |
|
|
0 commit comments