Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5bb46e7

Browse files
committed
Fix for bug #795: two clauses that seem redundant are not really, if
one is pushed down into an outer join and the other is not.
1 parent8031b06 commit5bb46e7

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

‎src/backend/optimizer/util/relnode.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/relnode.c,v 1.39 2002/09/04 20:31:22 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/relnode.c,v 1.40 2002/10/12 22:24:49 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -28,7 +28,8 @@ static List *new_join_tlist(List *tlist, int first_resdomno);
2828
staticList*build_joinrel_restrictlist(Query*root,
2929
RelOptInfo*joinrel,
3030
RelOptInfo*outer_rel,
31-
RelOptInfo*inner_rel);
31+
RelOptInfo*inner_rel,
32+
JoinTypejointype);
3233
staticvoidbuild_joinrel_joinlist(RelOptInfo*joinrel,
3334
RelOptInfo*outer_rel,
3435
RelOptInfo*inner_rel);
@@ -334,7 +335,8 @@ build_join_rel(Query *root,
334335
*restrictlist_ptr=build_joinrel_restrictlist(root,
335336
joinrel,
336337
outer_rel,
337-
inner_rel);
338+
inner_rel,
339+
jointype);
338340
returnjoinrel;
339341
}
340342

@@ -419,7 +421,8 @@ build_join_rel(Query *root,
419421
restrictlist=build_joinrel_restrictlist(root,
420422
joinrel,
421423
outer_rel,
422-
inner_rel);
424+
inner_rel,
425+
jointype);
423426
if (restrictlist_ptr)
424427
*restrictlist_ptr=restrictlist;
425428
build_joinrel_joinlist(joinrel,outer_rel,inner_rel);
@@ -508,6 +511,7 @@ new_join_tlist(List *tlist,
508511
* 'joinrel' is a join relation node
509512
* 'outer_rel' and 'inner_rel' are a pair of relations that can be joined
510513
*to form joinrel.
514+
* 'jointype' is the type of join used.
511515
*
512516
* build_joinrel_restrictlist() returns a list of relevant restrictinfos,
513517
* whereas build_joinrel_joinlist() stores its results in the joinrel's
@@ -522,7 +526,8 @@ static List *
522526
build_joinrel_restrictlist(Query*root,
523527
RelOptInfo*joinrel,
524528
RelOptInfo*outer_rel,
525-
RelOptInfo*inner_rel)
529+
RelOptInfo*inner_rel,
530+
JoinTypejointype)
526531
{
527532
List*result=NIL;
528533
List*rlist;
@@ -553,6 +558,11 @@ build_joinrel_restrictlist(Query *root,
553558
* one clause that checks equality between any set member on the left
554559
* and any member on the right; by transitivity, all the rest are then
555560
* equal.
561+
*
562+
* Weird special case: if we have two clauses that seem redundant
563+
* except one is pushed down into an outer join and the other isn't,
564+
* then they're not really redundant, because one constrains the
565+
* joined rows after addition of null fill rows, and the other doesn't.
556566
*/
557567
foreach(item,rlist)
558568
{
@@ -576,7 +586,9 @@ build_joinrel_restrictlist(Query *root,
576586

577587
if (oldrinfo->mergejoinoperator!=InvalidOid&&
578588
rinfo->left_pathkey==oldrinfo->left_pathkey&&
579-
rinfo->right_pathkey==oldrinfo->right_pathkey)
589+
rinfo->right_pathkey==oldrinfo->right_pathkey&&
590+
(rinfo->ispusheddown==oldrinfo->ispusheddown||
591+
!IS_OUTER_JOIN(jointype)))
580592
{
581593
redundant= true;
582594
break;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp