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 /src | |
| 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.
Diffstat (limited to 'src')
| -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 } |
