mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-01 10:41:18 +02:00
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:
parent
8bf1e098dd
commit
ad511a3ff3
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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,
|
List *mergeclause_list,
|
||||||
JoinType jointype)
|
JoinType jointype)
|
||||||
{
|
{
|
||||||
|
bool useallclauses;
|
||||||
List *all_pathkeys;
|
List *all_pathkeys;
|
||||||
List *i;
|
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
|
* Each possible ordering of the available mergejoin clauses will
|
||||||
* generate a differently-sorted result path at essentially the same
|
* generate a differently-sorted result path at essentially the same
|
||||||
@ -212,6 +234,11 @@ sort_inner_and_outer(Query *root,
|
|||||||
mergeclause_list);
|
mergeclause_list);
|
||||||
Assert(cur_mergeclauses != NIL);
|
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.
|
* Build sort pathkeys for both sides.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user