|
9 | 9 | *
|
10 | 10 | *
|
11 | 11 | * IDENTIFICATION
|
12 |
| - * $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.124 2006/08/12 02:52:05 tgl Exp $ |
| 12 | + * $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.125 2006/08/28 14:32:41 tgl Exp $ |
13 | 13 | *
|
14 | 14 | *-------------------------------------------------------------------------
|
15 | 15 | */
|
@@ -448,16 +448,32 @@ trivial_subqueryscan(SubqueryScan *plan)
|
448 | 448 | {
|
449 | 449 | TargetEntry *ptle = (TargetEntry *) lfirst(lp);
|
450 | 450 | TargetEntry *ctle = (TargetEntry *) lfirst(lc);
|
451 |
| - Var *var = (Var *) ptle->expr; |
452 | 451 |
|
453 | 452 | if (ptle->resjunk != ctle->resjunk)
|
454 | 453 | return false; /* tlist doesn't match junk status */
|
455 |
| - if (!var || !IsA(var, Var)) |
456 |
| - return false; /* tlist item not a Var */ |
457 |
| - Assert(var->varno == plan->scan.scanrelid); |
458 |
| - Assert(var->varlevelsup == 0); |
459 |
| - if (var->varattno != attrno) |
460 |
| - return false; /* out of order */ |
| 454 | + |
| 455 | + /* |
| 456 | + * We accept either a Var referencing the corresponding element of |
| 457 | + * the subplan tlist, or a Const equaling the subplan element. |
| 458 | + * See generate_setop_tlist() for motivation. |
| 459 | + */ |
| 460 | + if (ptle->expr && IsA(ptle->expr, Var)) |
| 461 | + { |
| 462 | + Var *var = (Var *) ptle->expr; |
| 463 | + |
| 464 | + Assert(var->varno == plan->scan.scanrelid); |
| 465 | + Assert(var->varlevelsup == 0); |
| 466 | + if (var->varattno != attrno) |
| 467 | + return false; /* out of order */ |
| 468 | + } |
| 469 | + else if (ptle->expr && IsA(ptle->expr, Const)) |
| 470 | + { |
| 471 | + if (!equal(ptle->expr, ctle->expr)) |
| 472 | + return false; |
| 473 | + } |
| 474 | + else |
| 475 | + return false; |
| 476 | + |
461 | 477 | attrno++;
|
462 | 478 | }
|
463 | 479 |
|
|
0 commit comments