sort_inner_and_outer needs a check to ensure that it's consumed all the

mergeclauses in RIGHT/FULL join cases, just like the other routines have.
I'm not quite sure why I thought it didn't need one --- but Nick
Fankhauser's recent bug report proves that it does.
This commit is contained in:
Tom Lane 2001-11-11 19:18:54 +00:00
parent 8bf1e098dd
commit ad511a3ff3
1 changed files with 28 additions and 1 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.66 2001/10/25 05:49:32 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.67 2001/11/11 19:18:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -150,9 +150,31 @@ sort_inner_and_outer(Query *root,
List *mergeclause_list,
JoinType jointype)
{
bool useallclauses;
List *all_pathkeys;
List *i;
/*
* If we are doing a right or full join, we must use *all* the
* mergeclauses as join clauses, else we will not have a valid plan.
*/
switch (jointype)
{
case JOIN_INNER:
case JOIN_LEFT:
useallclauses = false;
break;
case JOIN_RIGHT:
case JOIN_FULL:
useallclauses = true;
break;
default:
elog(ERROR, "sort_inner_and_outer: unexpected join type %d",
(int) jointype);
useallclauses = false; /* keep compiler quiet */
break;
}
/*
* Each possible ordering of the available mergejoin clauses will
* generate a differently-sorted result path at essentially the same
@ -212,6 +234,11 @@ sort_inner_and_outer(Query *root,
mergeclause_list);
Assert(cur_mergeclauses != NIL);
/* Forget it if can't use all the clauses in right/full join */
if (useallclauses &&
length(cur_mergeclauses) != length(mergeclause_list))
continue;
/*
* Build sort pathkeys for both sides.
*