summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPavan Deolasee2015-05-06 07:24:06 +0000
committerPavan Deolasee2015-05-06 07:24:06 +0000
commitbdcf083be809e550a9c0de68992b9d413a37192b (patch)
treef86ed00cb6bae06f2915939d260a08736eccd482 /src
parent0537867b20e4dd149b7925dfb4245d2c41a06ec7 (diff)
FILTER on aggregates should only be applied on datanodes where transition
values are computed This applies to those aggregates which can be pushed down to the datanodes.
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/nodeAgg.c7
-rw-r--r--src/backend/rewrite/rewriteHandler.c53
2 files changed, 34 insertions, 26 deletions
diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index 9b3633f2f2..d59d917eb0 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -2011,6 +2011,13 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
{
peraggstate->transfn_oid = transfn_oid = collectfn_oid;
peraggstate->collectfn_oid = collectfn_oid = InvalidOid;
+
+ /*
+ * Tuples should only be filtered on the datanodes when coordinator
+ * is doing collection and finalisation
+ */
+ aggref->aggfilter = NULL;
+ aggrefstate->aggfilter = NULL;
}
#else
/*
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index a00564a002..b576a7accc 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -1326,6 +1326,33 @@ rewriteTargetListUD(Query *parsetree, RangeTblEntry *target_rte,
}
#endif
+#ifdef PGXC
+ /*
+ * If relation is non-replicated, we need also to identify the Datanode
+ * from where tuple is fetched.
+ */
+ if (IS_PGXC_COORDINATOR &&
+ !IsConnFromCoord() &&
+ !IsLocatorReplicated(GetRelationLocType(RelationGetRelid(target_relation))))
+ {
+ var = makeVar(parsetree->resultRelation,
+ XC_NodeIdAttributeNumber,
+ INT4OID,
+ -1,
+ InvalidOid,
+ 0);
+
+ attrname = "xc_node_id";
+
+ tle = makeTargetEntry((Expr *) var,
+ list_length(parsetree->targetList) + 1,
+ pstrdup(attrname),
+ true);
+
+ parsetree->targetList = lappend(parsetree->targetList, tle);
+ }
+#endif
+
if (target_relation->rd_rel->relkind == RELKIND_RELATION ||
target_relation->rd_rel->relkind == RELKIND_MATVIEW)
{
@@ -1398,32 +1425,6 @@ rewriteTargetListUD(Query *parsetree, RangeTblEntry *target_rte,
parsetree->targetList = lappend(parsetree->targetList, tle);
}
-#ifdef PGXC
- /*
- * If relation is non-replicated, we need also to identify the Datanode
- * from where tuple is fetched.
- */
- if (IS_PGXC_COORDINATOR &&
- !IsConnFromCoord() &&
- !IsLocatorReplicated(GetRelationLocType(RelationGetRelid(target_relation))))
- {
- var = makeVar(parsetree->resultRelation,
- XC_NodeIdAttributeNumber,
- INT4OID,
- -1,
- InvalidOid,
- 0);
-
- attrname = "xc_node_id";
-
- tle = makeTargetEntry((Expr *) var,
- list_length(parsetree->targetList) + 1,
- pstrdup(attrname),
- true);
-
- parsetree->targetList = lappend(parsetree->targetList, tle);
- }
-#endif
}