diff options
| author | Pavan Deolasee | 2015-05-06 07:24:06 +0000 |
|---|---|---|
| committer | Pavan Deolasee | 2015-05-06 07:24:06 +0000 |
| commit | bdcf083be809e550a9c0de68992b9d413a37192b (patch) | |
| tree | f86ed00cb6bae06f2915939d260a08736eccd482 | |
| parent | 0537867b20e4dd149b7925dfb4245d2c41a06ec7 (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.
| -rw-r--r-- | src/backend/executor/nodeAgg.c | 7 | ||||
| -rw-r--r-- | src/backend/rewrite/rewriteHandler.c | 53 |
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 } |
