mirror of
https://github.com/postgres/postgres.git
synced 2025-06-27 23:21:58 +03:00
Replaced targetlist entry in GroupClause by reference number
in Resdom and GroupClause so changing of resno's doesn't confuse the grouping any more. Jan
This commit is contained in:
@ -6,7 +6,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.38 1999/05/09 23:31:46 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.39 1999/05/12 15:01:53 wieck Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -170,15 +170,7 @@ rangeTableEntry_used(Node *node, int rt_index, int sublevels_up)
|
||||
break;
|
||||
|
||||
case T_GroupClause:
|
||||
{
|
||||
GroupClause *grp = (GroupClause *)node;
|
||||
|
||||
return rangeTableEntry_used(
|
||||
(Node *)(grp->entry),
|
||||
rt_index,
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
return FALSE;
|
||||
|
||||
case T_Expr:
|
||||
{
|
||||
@ -348,12 +340,6 @@ rangeTableEntry_used(Node *node, int rt_index, int sublevels_up)
|
||||
sublevels_up))
|
||||
return TRUE;
|
||||
|
||||
if (rangeTableEntry_used(
|
||||
(Node *)(qry->groupClause),
|
||||
rt_index,
|
||||
sublevels_up))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
@ -407,16 +393,7 @@ attribute_used(Node *node, int rt_index, int attno, int sublevels_up)
|
||||
break;
|
||||
|
||||
case T_GroupClause:
|
||||
{
|
||||
GroupClause *grp = (GroupClause *)node;
|
||||
|
||||
return attribute_used(
|
||||
(Node *)(grp->entry),
|
||||
rt_index,
|
||||
attno,
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
return FALSE;
|
||||
|
||||
case T_Expr:
|
||||
{
|
||||
@ -558,13 +535,6 @@ attribute_used(Node *node, int rt_index, int attno, int sublevels_up)
|
||||
sublevels_up))
|
||||
return TRUE;
|
||||
|
||||
if (attribute_used(
|
||||
(Node *)(qry->groupClause),
|
||||
rt_index,
|
||||
attno,
|
||||
sublevels_up))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
@ -697,8 +667,6 @@ modifyAggrefUplevel(Node *node)
|
||||
modifyAggrefUplevel(
|
||||
(Node *)(qry->havingQual));
|
||||
|
||||
modifyAggrefUplevel(
|
||||
(Node *)(qry->groupClause));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -752,15 +720,6 @@ modifyAggrefChangeVarnodes(Node **nodePtr, int rt_index, int new_index, int subl
|
||||
break;
|
||||
|
||||
case T_GroupClause:
|
||||
{
|
||||
GroupClause *grp = (GroupClause *)node;
|
||||
|
||||
modifyAggrefChangeVarnodes(
|
||||
(Node **)(&(grp->entry)),
|
||||
rt_index,
|
||||
new_index,
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
|
||||
case T_Expr:
|
||||
@ -894,12 +853,6 @@ modifyAggrefChangeVarnodes(Node **nodePtr, int rt_index, int new_index, int subl
|
||||
rt_index,
|
||||
new_index,
|
||||
sublevels_up);
|
||||
|
||||
modifyAggrefChangeVarnodes(
|
||||
(Node **)(&(qry->groupClause)),
|
||||
rt_index,
|
||||
new_index,
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1186,13 +1139,6 @@ modifyAggrefQual(Node **nodePtr, Query *parsetree)
|
||||
break;
|
||||
|
||||
case T_GroupClause:
|
||||
{
|
||||
GroupClause *grp = (GroupClause *)node;
|
||||
|
||||
modifyAggrefQual(
|
||||
(Node **)(&(grp->entry)),
|
||||
parsetree);
|
||||
}
|
||||
break;
|
||||
|
||||
case T_Expr:
|
||||
@ -1386,13 +1332,6 @@ apply_RIR_adjust_sublevel(Node *node, int sublevels_up)
|
||||
break;
|
||||
|
||||
case T_GroupClause:
|
||||
{
|
||||
GroupClause *grp = (GroupClause *)node;
|
||||
|
||||
apply_RIR_adjust_sublevel(
|
||||
(Node *)(grp->entry),
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
|
||||
case T_Expr:
|
||||
@ -1539,17 +1478,6 @@ apply_RIR_view(Node **nodePtr, int rt_index, RangeTblEntry *rte, List *tlist, in
|
||||
break;
|
||||
|
||||
case T_GroupClause:
|
||||
{
|
||||
GroupClause *grp = (GroupClause *)node;
|
||||
|
||||
apply_RIR_view(
|
||||
(Node **)(&(grp->entry)),
|
||||
rt_index,
|
||||
rte,
|
||||
tlist,
|
||||
modified,
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
|
||||
case T_Expr:
|
||||
@ -1724,14 +1652,6 @@ apply_RIR_view(Node **nodePtr, int rt_index, RangeTblEntry *rte, List *tlist, in
|
||||
tlist,
|
||||
modified,
|
||||
sublevels_up);
|
||||
|
||||
apply_RIR_view(
|
||||
(Node **)(&(qry->groupClause)),
|
||||
rt_index,
|
||||
rte,
|
||||
tlist,
|
||||
modified,
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1898,10 +1818,8 @@ ApplyRetrieveRule(Query *parsetree,
|
||||
}
|
||||
if (*modified && !badsql) {
|
||||
AddQual(parsetree, rule_action->qual);
|
||||
/* This will only work if the query made to the view defined by the following
|
||||
* groupClause groups by the same attributes or does not use group at all! */
|
||||
if (parsetree->groupClause == NULL)
|
||||
parsetree->groupClause=rule_action->groupClause;
|
||||
AddGroupClause(parsetree, rule_action->groupClause,
|
||||
rule_action->targetList);
|
||||
AddHavingQual(parsetree, rule_action->havingQual);
|
||||
parsetree->hasAggs = (rule_action->hasAggs || parsetree->hasAggs);
|
||||
parsetree->hasSubLinks = (rule_action->hasSubLinks || parsetree->hasSubLinks);
|
||||
@ -1935,12 +1853,6 @@ fireRIRonSubselect(Node *node)
|
||||
break;
|
||||
|
||||
case T_GroupClause:
|
||||
{
|
||||
GroupClause *grp = (GroupClause *)node;
|
||||
|
||||
fireRIRonSubselect(
|
||||
(Node *)(grp->entry));
|
||||
}
|
||||
break;
|
||||
|
||||
case T_Expr:
|
||||
@ -2048,9 +1960,6 @@ fireRIRonSubselect(Node *node)
|
||||
|
||||
fireRIRonSubselect(
|
||||
(Node *)(qry->havingQual));
|
||||
|
||||
fireRIRonSubselect(
|
||||
(Node *)(qry->groupClause));
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.29 1999/02/13 23:17:49 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.30 1999/05/12 15:01:55 wieck Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -65,14 +65,6 @@ OffsetVarNodes(Node *node, int offset, int sublevels_up)
|
||||
break;
|
||||
|
||||
case T_GroupClause:
|
||||
{
|
||||
GroupClause *grp = (GroupClause *)node;
|
||||
|
||||
OffsetVarNodes(
|
||||
(Node *)(grp->entry),
|
||||
offset,
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
|
||||
case T_Expr:
|
||||
@ -199,11 +191,6 @@ OffsetVarNodes(Node *node, int offset, int sublevels_up)
|
||||
(Node *)(qry->havingQual),
|
||||
offset,
|
||||
sublevels_up);
|
||||
|
||||
OffsetVarNodes(
|
||||
(Node *)(qry->groupClause),
|
||||
offset,
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -284,15 +271,6 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up)
|
||||
break;
|
||||
|
||||
case T_GroupClause:
|
||||
{
|
||||
GroupClause *grp = (GroupClause *)node;
|
||||
|
||||
ChangeVarNodes(
|
||||
(Node *)(grp->entry),
|
||||
rt_index,
|
||||
new_index,
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
|
||||
case T_Expr:
|
||||
@ -430,12 +408,6 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up)
|
||||
rt_index,
|
||||
new_index,
|
||||
sublevels_up);
|
||||
|
||||
ChangeVarNodes(
|
||||
(Node *)(qry->groupClause),
|
||||
rt_index,
|
||||
new_index,
|
||||
sublevels_up);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -562,6 +534,44 @@ AddNotQual(Query *parsetree, Node *qual)
|
||||
AddQual(parsetree, copy);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
AddGroupClause(Query *parsetree, List *group_by, List *tlist)
|
||||
{
|
||||
List *l;
|
||||
List *tl;
|
||||
GroupClause *groupclause;
|
||||
TargetEntry *tle;
|
||||
int new_resno;
|
||||
|
||||
new_resno = length(parsetree->targetList);
|
||||
|
||||
foreach (l, group_by)
|
||||
{
|
||||
groupclause = (GroupClause *)copyObject(lfirst(l));
|
||||
tle = NULL;
|
||||
foreach(tl, tlist)
|
||||
{
|
||||
if (((TargetEntry *)lfirst(tl))->resdom->resgroupref ==
|
||||
groupclause->tleGroupref)
|
||||
{
|
||||
tle = (TargetEntry *)copyObject(lfirst(tl));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (tle == NULL)
|
||||
elog(ERROR, "AddGroupClause(): GROUP BY entry not found in rules targetlist");
|
||||
|
||||
tle->resdom->resno = ++new_resno;
|
||||
tle->resdom->resjunk = true;
|
||||
tle->resdom->resgroupref = length(parsetree->groupClause) + 1;
|
||||
groupclause->tleGroupref = tle->resdom->resgroupref;
|
||||
|
||||
parsetree->targetList = lappend(parsetree->targetList, tle);
|
||||
parsetree->groupClause = lappend(parsetree->groupClause, groupclause);
|
||||
}
|
||||
}
|
||||
|
||||
static Node *
|
||||
make_null(Oid type)
|
||||
{
|
||||
@ -688,7 +698,10 @@ ResolveNew(RewriteInfo *info, List *targetlist, Node **nodePtr,
|
||||
*nodePtr = make_null(((Var *) node)->vartype);
|
||||
}
|
||||
else
|
||||
{
|
||||
*nodePtr = copyObject(n);
|
||||
((Var *) *nodePtr)->varlevelsup = this_varlevelsup;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -709,6 +722,8 @@ ResolveNew(RewriteInfo *info, List *targetlist, Node **nodePtr,
|
||||
ResolveNew(info, targetlist, (Node **) &(query->qual), sublevels_up + 1);
|
||||
}
|
||||
break;
|
||||
case T_GroupClause:
|
||||
break;
|
||||
default:
|
||||
/* ignore the others */
|
||||
break;
|
||||
@ -720,7 +735,10 @@ FixNew(RewriteInfo *info, Query *parsetree)
|
||||
{
|
||||
ResolveNew(info, parsetree->targetList,
|
||||
(Node **) &(info->rule_action->targetList), 0);
|
||||
ResolveNew(info, parsetree->targetList, &info->rule_action->qual, 0);
|
||||
ResolveNew(info, parsetree->targetList,
|
||||
(Node **) &info->rule_action->qual, 0);
|
||||
ResolveNew(info, parsetree->targetList,
|
||||
(Node **) &(info->rule_action->groupClause), 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Reference in New Issue
Block a user