aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-01-23 02:23:30 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-01-23 02:23:30 +0000
commitdddc2afb6e7fa614ce98f26ccdb1da8ee88e68ae (patch)
tree221bf3f41c2545d4b81cb167cfa33a760505a27d /src
parent3b01217d7dc1441bdab0d07f7b041a2851b57008 (diff)
downloadpostgresql-dddc2afb6e7fa614ce98f26ccdb1da8ee88e68ae.tar.gz
postgresql-dddc2afb6e7fa614ce98f26ccdb1da8ee88e68ae.zip
The result of a FULL or RIGHT join can't be assumed to be sorted by the
left input's sorting, because null rows may be inserted at various points. Per report from Ferenc Lutischá¸n.
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/path/joinpath.c7
-rw-r--r--src/backend/optimizer/path/pathkeys.c11
-rw-r--r--src/include/optimizer/paths.h3
3 files changed, 16 insertions, 5 deletions
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c
index 956dd991cd6..b1a25505b5e 100644
--- a/src/backend/optimizer/path/joinpath.c
+++ b/src/backend/optimizer/path/joinpath.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.82.2.1 2004/04/06 18:46:25 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.82.2.2 2005/01/23 02:23:16 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -271,7 +271,8 @@ sort_inner_and_outer(Query *root,
cur_mergeclauses,
innerrel);
/* Build pathkeys representing output sort order. */
- merge_pathkeys = build_join_pathkeys(root, joinrel, outerkeys);
+ merge_pathkeys = build_join_pathkeys(root, joinrel, jointype,
+ outerkeys);
/*
* And now we can make the path.
@@ -431,7 +432,7 @@ match_unsorted_outer(Query *root,
* as a nestloop, and even if some of the mergeclauses are
* implemented by qpquals rather than as true mergeclauses):
*/
- merge_pathkeys = build_join_pathkeys(root, joinrel,
+ merge_pathkeys = build_join_pathkeys(root, joinrel, jointype,
outerpath->pathkeys);
if (nestjoinOK)
diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c
index fd3f3ab1869..16a9a1c130c 100644
--- a/src/backend/optimizer/path/pathkeys.c
+++ b/src/backend/optimizer/path/pathkeys.c
@@ -11,7 +11,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/pathkeys.c,v 1.53.4.1 2003/12/03 17:45:36 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/pathkeys.c,v 1.53.4.2 2005/01/23 02:23:16 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -861,7 +861,12 @@ build_subquery_pathkeys(Query *root, RelOptInfo *rel, Query *subquery)
* vars they were joined with; furthermore, it doesn't matter what kind
* of join algorithm is actually used.
*
+ * EXCEPTION: in a FULL or RIGHT join, we cannot treat the result as
+ * having the outer path's path keys, because null lefthand rows may be
+ * inserted at random points. It must be treated as unsorted.
+ *
* 'joinrel' is the join relation that paths are being formed for
+ * 'jointype' is the join type (inner, left, full, etc)
* 'outer_pathkeys' is the list of the current outer path's path keys
*
* Returns the list of new path keys.
@@ -869,8 +874,12 @@ build_subquery_pathkeys(Query *root, RelOptInfo *rel, Query *subquery)
List *
build_join_pathkeys(Query *root,
RelOptInfo *joinrel,
+ JoinType jointype,
List *outer_pathkeys)
{
+ if (jointype == JOIN_FULL || jointype == JOIN_RIGHT)
+ return NIL;
+
/*
* This used to be quite a complex bit of code, but now that all
* pathkey sublists start out life canonicalized, we don't have to do
diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h
index 2a748975195..bab33083d8e 100644
--- a/src/include/optimizer/paths.h
+++ b/src/include/optimizer/paths.h
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: paths.h,v 1.69 2003/08/04 02:40:14 momjian Exp $
+ * $Id: paths.h,v 1.69.4.1 2005/01/23 02:23:30 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -109,6 +109,7 @@ extern List *build_subquery_pathkeys(Query *root, RelOptInfo *rel,
Query *subquery);
extern List *build_join_pathkeys(Query *root,
RelOptInfo *joinrel,
+ JoinType jointype,
List *outer_pathkeys);
extern List *make_pathkeys_for_sortclauses(List *sortclauses,
List *tlist);