|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.104 2001/04/18 20:42:55 tgl Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.105 2001/04/30 19:24:47 tgl Exp $ |
12 | 12 | *
|
13 | 13 | *-------------------------------------------------------------------------
|
14 | 14 | */
|
@@ -363,8 +363,41 @@ pull_up_subqueries(Query *parse, Node *jtnode)
|
363 | 363 | {
|
364 | 364 | JoinExpr *j = (JoinExpr *) jtnode;
|
365 | 365 |
|
366 |
| - j->larg = pull_up_subqueries(parse, j->larg); |
367 |
| - j->rarg = pull_up_subqueries(parse, j->rarg); |
| 366 | + /* |
| 367 | + * At the moment, we can't pull up subqueries that are inside the |
| 368 | + * nullable side of an outer join, because substituting their target |
| 369 | + * list entries for upper Var references wouldn't do the right thing |
| 370 | + * (the entries wouldn't go to NULL when they're supposed to). |
| 371 | + * Suppressing the pullup is an ugly, performance-losing hack, but |
| 372 | + * I see no alternative for now. Find a better way to handle this |
| 373 | + * when we redesign query trees --- tgl 4/30/01. |
| 374 | + */ |
| 375 | + switch (j->jointype) |
| 376 | + { |
| 377 | + case JOIN_INNER: |
| 378 | + j->larg = pull_up_subqueries(parse, j->larg); |
| 379 | + j->rarg = pull_up_subqueries(parse, j->rarg); |
| 380 | + break; |
| 381 | + case JOIN_LEFT: |
| 382 | + j->larg = pull_up_subqueries(parse, j->larg); |
| 383 | + break; |
| 384 | + case JOIN_FULL: |
| 385 | + break; |
| 386 | + case JOIN_RIGHT: |
| 387 | + j->rarg = pull_up_subqueries(parse, j->rarg); |
| 388 | + break; |
| 389 | + case JOIN_UNION: |
| 390 | + /* |
| 391 | + * This is where we fail if upper levels of planner |
| 392 | + * haven't rewritten UNION JOIN as an Append ... |
| 393 | + */ |
| 394 | + elog(ERROR, "UNION JOIN is not implemented yet"); |
| 395 | + break; |
| 396 | + default: |
| 397 | + elog(ERROR, "pull_up_subqueries: unexpected join type %d", |
| 398 | + j->jointype); |
| 399 | + break; |
| 400 | + } |
368 | 401 | }
|
369 | 402 | else
|
370 | 403 | elog(ERROR, "pull_up_subqueries: unexpected node type %d",
|
|
0 commit comments