summaryrefslogtreecommitdiff
path: root/src/backend/rewrite
diff options
context:
space:
mode:
authorBruce Momjian1998-01-04 04:31:43 +0000
committerBruce Momjian1998-01-04 04:31:43 +0000
commit4b05912f0b6aa69507bc32ac6ddaf8aeecdeb396 (patch)
tree2ff63f8cd09f1d5c628cefb16827c406ef40f014 /src/backend/rewrite
parentc629d3b9d65fdce320aba26d092bfe96274c6092 (diff)
Fix for count(*), aggs with views and multiple tables and sum(3).
Diffstat (limited to 'src/backend/rewrite')
-rw-r--r--src/backend/rewrite/locks.c28
-rw-r--r--src/backend/rewrite/rewriteHandler.c3
-rw-r--r--src/backend/rewrite/rewriteManip.c45
3 files changed, 69 insertions, 7 deletions
diff --git a/src/backend/rewrite/locks.c b/src/backend/rewrite/locks.c
index d446da653cc..70dc37080e2 100644
--- a/src/backend/rewrite/locks.c
+++ b/src/backend/rewrite/locks.c
@@ -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;
+
}
/*
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index d6dc95e387d..1f6bd86343c 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -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);
}
}
diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c
index f7e3896040c..122067a2424 100644
--- a/src/backend/rewrite/rewriteManip.c
+++ b/src/backend/rewrite/rewriteManip.c
@@ -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);
}