Teach is_distinct_query to recognize that GROUP BY forces a subquery's

output to be distinct, if all the GROUP BY columns appear in the output.
Per suggestion from Dennis Haney.
This commit is contained in:
Tom Lane 2004-03-02 16:42:20 +00:00
parent 49032ca765
commit 03e2a47e0b
1 changed files with 24 additions and 1 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.101 2004/02/03 17:34:03 tgl Exp $
* $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.102 2004/03/02 16:42:20 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -25,6 +25,7 @@
#include "optimizer/pathnode.h"
#include "optimizer/paths.h"
#include "optimizer/restrictinfo.h"
#include "optimizer/tlist.h"
#include "parser/parse_expr.h"
#include "parser/parse_oper.h"
#include "parser/parsetree.h"
@ -688,6 +689,28 @@ is_distinct_query(Query *query)
return true;
}
/*
* GROUP BY guarantees uniqueness if all the grouped columns appear in
* the output. In our implementation this means checking they are non
* resjunk columns.
*/
if (query->groupClause)
{
List *gl;
foreach(gl, query->groupClause)
{
GroupClause *grpcl = (GroupClause *) lfirst(gl);
TargetEntry *tle = get_sortgroupclause_tle(grpcl,
query->targetList);
if (tle->resdom->resjunk)
break;
}
if (!gl) /* got to the end? */
return true;
}
/*
* XXX Are there any other cases in which we can easily see the result
* must be distinct?