mirror of
https://github.com/postgres/postgres.git
synced 2025-06-27 23:21:58 +03:00
Fix for count(*), aggs with views and multiple tables and sum(3).
This commit is contained in:
@ -6,7 +6,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/Attic/locks.c,v 1.5 1997/09/08 21:46:33 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/Attic/locks.c,v 1.6 1998/01/04 04:31:27 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -58,6 +58,14 @@ nodeThisLockWasTriggered(Node *node, int varno, AttrNumber attnum)
|
||||
nodeThisLockWasTriggered(tle->expr, varno, attnum);
|
||||
}
|
||||
break;
|
||||
case T_Aggreg:
|
||||
{
|
||||
Aggreg *agg = (Aggreg *) node;
|
||||
|
||||
return
|
||||
nodeThisLockWasTriggered(agg->target, varno, attnum);
|
||||
}
|
||||
break;
|
||||
case T_List:
|
||||
{
|
||||
List *l;
|
||||
@ -87,10 +95,20 @@ thisLockWasTriggered(int varno,
|
||||
AttrNumber attnum,
|
||||
Query *parsetree)
|
||||
{
|
||||
return
|
||||
(nodeThisLockWasTriggered(parsetree->qual, varno, attnum) ||
|
||||
nodeThisLockWasTriggered((Node *) parsetree->targetList,
|
||||
varno, attnum));
|
||||
int i;
|
||||
|
||||
if (nodeThisLockWasTriggered(parsetree->qual, varno, attnum))
|
||||
return true;
|
||||
|
||||
if (nodeThisLockWasTriggered((Node *) parsetree->targetList, varno, attnum))
|
||||
return true;
|
||||
|
||||
for(i=0; i < parsetree->qry_numAgg; i++)
|
||||
if (nodeThisLockWasTriggered(parsetree->qry_aggs[i]->target,
|
||||
varno, attnum))
|
||||
return true;
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.6 1997/09/08 21:46:38 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.7 1998/01/04 04:31:28 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -225,6 +225,7 @@ FireRetrieveRulesAtQuery(Query *parsetree,
|
||||
{
|
||||
*instead_flag = TRUE;
|
||||
FixResdomTypes(parsetree->targetList);
|
||||
|
||||
return lcons(parsetree, NIL);
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.8 1997/09/18 20:21:11 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.9 1998/01/04 04:31:29 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -46,6 +46,13 @@ OffsetVarNodes(Node *node, int offset)
|
||||
OffsetVarNodes(tle->expr, offset);
|
||||
}
|
||||
break;
|
||||
case T_Aggreg:
|
||||
{
|
||||
Aggreg *agg = (Aggreg *) node;
|
||||
|
||||
OffsetVarNodes(agg->target, offset);
|
||||
}
|
||||
break;
|
||||
case T_Expr:
|
||||
{
|
||||
Expr *expr = (Expr *) node;
|
||||
@ -91,6 +98,13 @@ ChangeVarNodes(Node *node, int old_varno, int new_varno)
|
||||
ChangeVarNodes(tle->expr, old_varno, new_varno);
|
||||
}
|
||||
break;
|
||||
case T_Aggreg:
|
||||
{
|
||||
Aggreg *agg = (Aggreg *) node;
|
||||
|
||||
ChangeVarNodes(agg->target, old_varno, new_varno);
|
||||
}
|
||||
break;
|
||||
case T_Expr:
|
||||
{
|
||||
Expr *expr = (Expr *) node;
|
||||
@ -235,6 +249,9 @@ ResolveNew(RewriteInfo *info, List *targetlist, Node **nodePtr)
|
||||
case T_TargetEntry:
|
||||
ResolveNew(info, targetlist, &((TargetEntry *) node)->expr);
|
||||
break;
|
||||
case T_Aggreg:
|
||||
ResolveNew(info, targetlist, &((Aggreg *) node)->target);
|
||||
break;
|
||||
case T_Expr:
|
||||
ResolveNew(info, targetlist, (Node **) (&(((Expr *) node)->args)));
|
||||
break;
|
||||
@ -325,6 +342,14 @@ nodeHandleRIRAttributeRule(Node **nodePtr,
|
||||
rt_index, attr_num, modified, badsql);
|
||||
}
|
||||
break;
|
||||
case T_Aggreg:
|
||||
{
|
||||
Aggreg *agg = (Aggreg *) node;
|
||||
|
||||
nodeHandleRIRAttributeRule(&agg->target, rtable, targetlist,
|
||||
rt_index, attr_num, modified, badsql);
|
||||
}
|
||||
break;
|
||||
case T_Expr:
|
||||
{
|
||||
Expr *expr = (Expr *) node;
|
||||
@ -395,11 +420,16 @@ HandleRIRAttributeRule(Query *parsetree,
|
||||
int *modified,
|
||||
int *badsql)
|
||||
{
|
||||
int i;
|
||||
|
||||
nodeHandleRIRAttributeRule((Node **) (&(parsetree->targetList)), rtable,
|
||||
targetlist, rt_index, attr_num,
|
||||
modified, badsql);
|
||||
nodeHandleRIRAttributeRule(&parsetree->qual, rtable, targetlist,
|
||||
rt_index, attr_num, modified, badsql);
|
||||
for(i=0; i < parsetree->qry_numAgg; i++)
|
||||
nodeHandleRIRAttributeRule(&parsetree->qry_aggs[i]->target, rtable,
|
||||
targetlist, rt_index, attr_num, modified, badsql);
|
||||
}
|
||||
|
||||
|
||||
@ -437,6 +467,14 @@ nodeHandleViewRule(Node **nodePtr,
|
||||
rt_index, modified);
|
||||
}
|
||||
break;
|
||||
case T_Aggreg:
|
||||
{
|
||||
Aggreg *agg = (Aggreg *) node;
|
||||
|
||||
nodeHandleViewRule(&(agg->target), rtable, targetlist,
|
||||
rt_index, modified);
|
||||
}
|
||||
break;
|
||||
case T_Expr:
|
||||
{
|
||||
Expr *expr = (Expr *) node;
|
||||
@ -483,8 +521,13 @@ HandleViewRule(Query *parsetree,
|
||||
int rt_index,
|
||||
int *modified)
|
||||
{
|
||||
int i;
|
||||
|
||||
nodeHandleViewRule(&parsetree->qual, rtable, targetlist, rt_index,
|
||||
modified);
|
||||
nodeHandleViewRule((Node **) (&(parsetree->targetList)), rtable, targetlist,
|
||||
rt_index, modified);
|
||||
for(i=0; i < parsetree->qry_numAgg; i++)
|
||||
nodeHandleViewRule(&parsetree->qry_aggs[i]->target, rtable, targetlist, rt_index,
|
||||
modified);
|
||||
}
|
||||
|
Reference in New Issue
Block a user