mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
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:
parent
49032ca765
commit
03e2a47e0b
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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/pathnode.h"
|
||||||
#include "optimizer/paths.h"
|
#include "optimizer/paths.h"
|
||||||
#include "optimizer/restrictinfo.h"
|
#include "optimizer/restrictinfo.h"
|
||||||
|
#include "optimizer/tlist.h"
|
||||||
#include "parser/parse_expr.h"
|
#include "parser/parse_expr.h"
|
||||||
#include "parser/parse_oper.h"
|
#include "parser/parse_oper.h"
|
||||||
#include "parser/parsetree.h"
|
#include "parser/parsetree.h"
|
||||||
@ -688,6 +689,28 @@ is_distinct_query(Query *query)
|
|||||||
return true;
|
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
|
* XXX Are there any other cases in which we can easily see the result
|
||||||
* must be distinct?
|
* must be distinct?
|
||||||
|
Loading…
x
Reference in New Issue
Block a user