mirror of
https://github.com/postgres/postgres.git
synced 2025-10-25 13:17:41 +03:00
1) Queries using the having clause on base tables should work well
now. Here some tested features, (examples included in the patch):
1.1) Subselects in the having clause 1.2) Double nested subselects
1.3) Subselects used in the where clause and in the having clause
simultaneously 1.4) Union Selects using having 1.5) Indexes
on the base relations are used correctly 1.6) Unallowed Queries
are prevented (e.g. qualifications in the
having clause that belong to the where clause) 1.7) Insert
into as select
2) Queries using the having clause on view relations also work
but there are some restrictions:
2.1) Create View as Select ... Having ...; using base tables in
the select 2.1.1) The Query rewrite system:
2.1.2) Why are only simple queries allowed against a view from 2.1)
? 2.2) Select ... from testview1, testview2, ... having...; 3) Bug
in ExecMergeJoin ??
Regards Stefan
This commit is contained in:
@@ -109,22 +109,24 @@ ExecAgg(Agg *node)
|
||||
bool isNull = FALSE,
|
||||
isNull1 = FALSE,
|
||||
isNull2 = FALSE;
|
||||
|
||||
|
||||
do {
|
||||
|
||||
bool qual_result;
|
||||
|
||||
|
||||
/* ---------------------
|
||||
* get state info from node
|
||||
* ---------------------
|
||||
*/
|
||||
|
||||
/* We loop retrieving groups until we find one matching node->plan.qual */
|
||||
do {
|
||||
|
||||
aggstate = node->aggstate;
|
||||
if (aggstate->agg_done)
|
||||
return NULL;
|
||||
|
||||
estate = node->plan.state;
|
||||
econtext = aggstate->csstate.cstate.cs_ExprContext;
|
||||
|
||||
nagg = length(node->aggs);
|
||||
|
||||
aggregates = (Aggreg **) palloc(sizeof(Aggreg *) * nagg);
|
||||
@@ -235,8 +237,7 @@ ExecAgg(Agg *node)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ----------------
|
||||
* for each tuple from the the outer plan, apply all the aggregates
|
||||
* ----------------
|
||||
@@ -474,11 +475,6 @@ ExecAgg(Agg *node)
|
||||
* slot and return it.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
}
|
||||
while((ExecQual(fix_opids(node->plan.qual),econtext)!=true) &&
|
||||
(node->plan.qual!=NULL));
|
||||
|
||||
|
||||
ExecStoreTuple(oneTuple,
|
||||
aggstate->csstate.css_ScanTupleSlot,
|
||||
@@ -488,8 +484,13 @@ ExecAgg(Agg *node)
|
||||
|
||||
resultSlot = ExecProject(projInfo, &isDone);
|
||||
|
||||
/* As long as the retrieved group does not match the qualifications it is ignored and
|
||||
* the next group is fetched */
|
||||
qual_result=ExecQual(fix_opids(node->plan.qual),econtext);
|
||||
if (oneTuple)
|
||||
pfree(oneTuple);
|
||||
pfree(oneTuple);
|
||||
}
|
||||
while((node->plan.qual!=NULL) && (qual_result!=true));
|
||||
|
||||
return resultSlot;
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/executor/nodeMergejoin.c,v 1.16 1998/06/15 19:28:22 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/executor/nodeMergejoin.c,v 1.17 1998/07/19 05:49:13 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -365,7 +365,9 @@ CleanUpSort(Plan *plan)
|
||||
{
|
||||
Sort *sort = (Sort *) plan;
|
||||
|
||||
psort_end(sort);
|
||||
/* This may need to be fixed or moved somewhere else, bjm */
|
||||
/* psort_end(sort); */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user