From 026b444fd29df8fd66036f7ce839779755b95284 Mon Sep 17 00:00:00 2001 From: Jason Petersen Date: Fri, 30 Sep 2016 09:29:23 -0600 Subject: [PATCH] First stab at addressing 9.6 API changes Still need to deal with ruleutils. --- .../distributed/executor/multi_executor.c | 2 +- .../distributed/planner/multi_join_order.c | 1 + .../planner/multi_logical_optimizer.c | 24 ++++++++++++++++ .../planner/multi_logical_planner.c | 10 +++++++ .../planner/multi_master_planner.c | 28 +++++++++++++++---- .../planner/multi_router_planner.c | 15 ++++++++-- src/backend/distributed/test/fake_fdw.c | 6 ++++ .../distributed/utils/metadata_cache.c | 1 + .../worker/worker_partition_protocol.c | 1 + src/include/distributed/multi_executor.h | 8 +++++- 10 files changed, 87 insertions(+), 9 deletions(-) diff --git a/src/backend/distributed/executor/multi_executor.c b/src/backend/distributed/executor/multi_executor.c index 4301fec6c..3a07aecb2 100644 --- a/src/backend/distributed/executor/multi_executor.c +++ b/src/backend/distributed/executor/multi_executor.c @@ -200,7 +200,7 @@ CopyQueryResults(List *masterCopyStmtList) /* Execute query plan. */ void -multi_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, long count) +multi_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, tuplecount_t count) { int eflags = queryDesc->estate->es_top_eflags; diff --git a/src/backend/distributed/planner/multi_join_order.c b/src/backend/distributed/planner/multi_join_order.c index c66dc81c8..c5891bb9d 100644 --- a/src/backend/distributed/planner/multi_join_order.c +++ b/src/backend/distributed/planner/multi_join_order.c @@ -17,6 +17,7 @@ #include "access/nbtree.h" #include "access/heapam.h" #include "access/htup_details.h" +#include "catalog/pg_am.h" #include "distributed/metadata_cache.h" #include "distributed/multi_join_order.h" #include "distributed/multi_physical_planner.h" diff --git a/src/backend/distributed/planner/multi_logical_optimizer.c b/src/backend/distributed/planner/multi_logical_optimizer.c index 214691fca..882b3b1ff 100644 --- a/src/backend/distributed/planner/multi_logical_optimizer.c +++ b/src/backend/distributed/planner/multi_logical_optimizer.c @@ -1526,6 +1526,11 @@ MasterAggregateExpression(Aggref *originalAggregate, newMasterAggregate->aggdistinct = NULL; newMasterAggregate->aggfnoid = sumFunctionId; newMasterAggregate->aggtype = masterReturnType; +#if (PG_VERSION_NUM >= 90600) + newMasterAggregate->aggtranstype = INTERNALOID; + newMasterAggregate->aggargtypes = list_make1_oid(NUMERICOID); + newMasterAggregate->aggsplit = AGGSPLIT_SIMPLE; +#endif column = makeVar(masterTableId, walkerContext->columnId, workerReturnType, workerReturnTypeMod, workerCollationId, columnLevelsUp); @@ -1682,6 +1687,11 @@ MasterAverageExpression(Oid sumAggregateType, Oid countAggregateType, firstSum->aggtype = get_func_rettype(firstSum->aggfnoid); firstSum->args = list_make1(firstTargetEntry); firstSum->aggkind = AGGKIND_NORMAL; +#if (PG_VERSION_NUM >= 90600) + firstSum->aggtranstype = INTERNALOID; + firstSum->aggargtypes = list_make1_oid(NUMERICOID); + firstSum->aggsplit = AGGSPLIT_SIMPLE; +#endif /* create the second argument for sum(column2) */ secondColumn = makeVar(masterTableId, (*columnId), countAggregateType, @@ -1694,6 +1704,11 @@ MasterAverageExpression(Oid sumAggregateType, Oid countAggregateType, secondSum->aggtype = get_func_rettype(secondSum->aggfnoid); secondSum->args = list_make1(secondTargetEntry); secondSum->aggkind = AGGKIND_NORMAL; +#if (PG_VERSION_NUM >= 90600) + secondSum->aggtranstype = INTERNALOID; + secondSum->aggargtypes = list_make1_oid(NUMERICOID); + secondSum->aggsplit = AGGSPLIT_SIMPLE; +#endif /* * Build the division operator between these two aggregates. This function @@ -2365,8 +2380,17 @@ ErrorIfContainsUnsupportedAggregate(MultiNode *logicalPlanNode) MultiExtendedOp *extendedOpNode = (MultiExtendedOp *) linitial(opNodeList); List *targetList = extendedOpNode->targetList; +#if (PG_VERSION_NUM >= 90600) + + /* + * PVC_REJECT_PLACEHOLDERS is now implicit if PVC_INCLUDE_PLACEHOLDERS + * isn't specified. + */ + List *expressionList = pull_var_clause((Node *) targetList, PVC_INCLUDE_AGGREGATES); +#else List *expressionList = pull_var_clause((Node *) targetList, PVC_INCLUDE_AGGREGATES, PVC_REJECT_PLACEHOLDERS); +#endif ListCell *expressionCell = NULL; foreach(expressionCell, expressionList) diff --git a/src/backend/distributed/planner/multi_logical_planner.c b/src/backend/distributed/planner/multi_logical_planner.c index 5868fda69..c49d6814a 100644 --- a/src/backend/distributed/planner/multi_logical_planner.c +++ b/src/backend/distributed/planner/multi_logical_planner.c @@ -1612,8 +1612,18 @@ ExtractRangeTableEntryWalker(Node *node, List **rangeTableList) List * pull_var_clause_default(Node *node) { +#if (PG_VERSION_NUM >= 90600) + + /* + * PVC_REJECT_PLACEHOLDERS is now implicit if PVC_INCLUDE_PLACEHOLDERS + * isn't specified. + */ + List *columnList = pull_var_clause(node, PVC_RECURSE_AGGREGATES); +#else List *columnList = pull_var_clause(node, PVC_RECURSE_AGGREGATES, PVC_REJECT_PLACEHOLDERS); +#endif + return columnList; } diff --git a/src/backend/distributed/planner/multi_master_planner.c b/src/backend/distributed/planner/multi_master_planner.c index f9bd61888..a1541d3a9 100644 --- a/src/backend/distributed/planner/multi_master_planner.c +++ b/src/backend/distributed/planner/multi_master_planner.c @@ -140,9 +140,13 @@ BuildAggregatePlan(Query *masterQuery, Plan *subPlan) havingQual = masterQuery->havingQual; /* estimate aggregate execution costs */ - MemSet(&aggregateCosts, 0, sizeof(AggClauseCosts)); + memset(&aggregateCosts, 0, sizeof(AggClauseCosts)); +#if (PG_VERSION_NUM >= 90600) + get_agg_clause_costs(NULL, (Node *) aggregateTargetList, AGGSPLIT_SIMPLE, + &aggregateCosts); +#else count_agg_clauses(NULL, (Node *) aggregateTargetList, &aggregateCosts); - count_agg_clauses(NULL, havingQual, &aggregateCosts); +#endif /* * For upper level plans above the sequential scan, the planner expects the @@ -178,10 +182,16 @@ BuildAggregatePlan(Query *masterQuery, Plan *subPlan) } /* finally create the plan */ - aggregatePlan = make_agg(NULL, aggregateTargetList, (List *) havingQual, - aggregateStrategy, &aggregateCosts, groupColumnCount, - groupColumnIdArray, groupColumnOpArray, NIL, +#if (PG_VERSION_NUM >= 90600) + aggregatePlan = make_agg(aggregateTargetList, (List *) havingQual, aggregateStrategy, + AGGSPLIT_SIMPLE, groupColumnCount, groupColumnIdArray, + groupColumnOpArray, NIL, NIL, rowEstimate, subPlan); +#else + aggregatePlan = make_agg(NULL, aggregateTargetList, (List *) havingQual, aggregateStrategy, + &aggregateCosts, groupColumnCount, groupColumnIdArray, + groupColumnOpArray, NIL, rowEstimate, subPlan); +#endif return aggregatePlan; } @@ -247,7 +257,11 @@ BuildSelectStatement(Query *masterQuery, char *masterTableName, if (masterQuery->sortClause) { List *sortClauseList = masterQuery->sortClause; +#if (PG_VERSION_NUM >= 90600) + Sort *sortPlan = make_sort_from_sortclauses(sortClauseList, topLevelPlan); +#else Sort *sortPlan = make_sort_from_sortclauses(NULL, sortClauseList, topLevelPlan); +#endif topLevelPlan = (Plan *) sortPlan; } @@ -256,11 +270,15 @@ BuildSelectStatement(Query *masterQuery, char *masterTableName, { Node *limitCount = masterQuery->limitCount; Node *limitOffset = masterQuery->limitOffset; +#if (PG_VERSION_NUM >= 90600) + Limit *limitPlan = make_limit(topLevelPlan, limitOffset, limitCount); +#else int64 offsetEstimate = 0; int64 countEstimate = 0; Limit *limitPlan = make_limit(topLevelPlan, limitOffset, limitCount, offsetEstimate, countEstimate); +#endif topLevelPlan = (Plan *) limitPlan; } diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index 3b281ab82..3de008c60 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -535,10 +535,21 @@ MasterIrreducibleExpressionWalker(Node *expression, WalkerState *state) * Once you've added them to this check, make sure you also evaluate them in the * executor! */ - StaticAssertStmt(PG_VERSION_NUM < 90600, "When porting to a newer PG this section" + StaticAssertStmt(PG_VERSION_NUM < 90700, "When porting to a newer PG this section" " needs to be reviewed."); + if (IsA(expression, Aggref)) + { + Aggref *expr = (Aggref *) expression; - if (IsA(expression, OpExpr)) + volatileFlag = func_volatile(expr->aggfnoid); + } + else if (IsA(expression, WindowFunc)) + { + WindowFunc *expr = (WindowFunc *) expression; + + volatileFlag = func_volatile(expr->winfnoid); + } + else if (IsA(expression, OpExpr)) { OpExpr *expr = (OpExpr *) expression; diff --git a/src/backend/distributed/test/fake_fdw.c b/src/backend/distributed/test/fake_fdw.c index 25bbf67f2..cc819d319 100644 --- a/src/backend/distributed/test/fake_fdw.c +++ b/src/backend/distributed/test/fake_fdw.c @@ -89,9 +89,15 @@ FakeGetForeignPaths(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid) Cost startup_cost = 0; Cost total_cost = startup_cost + baserel->rows; +#if (PG_VERSION_NUM >= 90600) + add_path(baserel, (Path *) create_foreignscan_path(root, baserel, NULL, baserel->rows, + startup_cost, total_cost, NIL, + NULL, NULL, NIL)); +#else add_path(baserel, (Path *) create_foreignscan_path(root, baserel, baserel->rows, startup_cost, total_cost, NIL, NULL, NULL, NIL)); +#endif } diff --git a/src/backend/distributed/utils/metadata_cache.c b/src/backend/distributed/utils/metadata_cache.c index 83d5ecd00..b153d7829 100644 --- a/src/backend/distributed/utils/metadata_cache.c +++ b/src/backend/distributed/utils/metadata_cache.c @@ -18,6 +18,7 @@ #include "access/xact.h" #include "access/sysattr.h" #include "catalog/indexing.h" +#include "catalog/pg_am.h" #include "catalog/pg_extension.h" #include "catalog/pg_namespace.h" #include "catalog/pg_type.h" diff --git a/src/backend/distributed/worker/worker_partition_protocol.c b/src/backend/distributed/worker/worker_partition_protocol.c index ced447154..5616428b3 100644 --- a/src/backend/distributed/worker/worker_partition_protocol.c +++ b/src/backend/distributed/worker/worker_partition_protocol.c @@ -25,6 +25,7 @@ #include "access/hash.h" #include "access/htup_details.h" #include "access/nbtree.h" +#include "catalog/pg_am.h" #include "catalog/pg_collation.h" #include "commands/copy.h" #include "commands/defrem.h" diff --git a/src/include/distributed/multi_executor.h b/src/include/distributed/multi_executor.h index 09f2af885..995d9d525 100644 --- a/src/include/distributed/multi_executor.h +++ b/src/include/distributed/multi_executor.h @@ -17,9 +17,15 @@ #define EXEC_FLAG_CITUS_MASTER_SELECT 0x100 #define EXEC_FLAG_CITUS_ROUTER_EXECUTOR 0x200 +#if (PG_VERSION_NUM >= 90600) +#define tuplecount_t uint64 +#else +#define tuplecount_t long +#endif + extern void multi_ExecutorStart(QueryDesc *queryDesc, int eflags); extern void multi_ExecutorRun(QueryDesc *queryDesc, - ScanDirection direction, long count); + ScanDirection direction, tuplecount_t count); extern void multi_ExecutorFinish(QueryDesc *queryDesc); extern void multi_ExecutorEnd(QueryDesc *queryDesc);