Skip to content

Commit da4d209

Browse files
committed
pathman: support for foreign tables added
1 parent 3f487f5 commit da4d209

File tree

1 file changed

+57
-7
lines changed

1 file changed

+57
-7
lines changed

contrib/pathman/pathman.c

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "storage/ipc.h"
2222
#include "catalog/pg_operator.h"
2323
#include "catalog/pg_type.h"
24+
#include "foreign/fdwapi.h"
2425

2526
PG_MODULE_MAGIC;
2627

@@ -118,6 +119,7 @@ _PG_fini(void)
118119
shmem_startup_hook = shmem_startup_hook_original;
119120
}
120121

122+
/* TODO: rename and write a descritption */
121123
PlannedStmt *
122124
my_planner_hook(Query *parse, int cursorOptions, ParamListInfo boundParams)
123125
{
@@ -129,6 +131,9 @@ my_planner_hook(Query *parse, int cursorOptions, ParamListInfo boundParams)
129131
inheritance_disabled = false;
130132
disable_inheritance(parse);
131133
result = standard_planner(parse, cursorOptions, boundParams);
134+
135+
/* TODO: invoke original hook */
136+
132137
return result;
133138
}
134139

@@ -318,18 +323,26 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
318323
AppendRelInfo *appinfo;
319324
Node *node;
320325
ListCell *lc, *lc2;
326+
Relation newrelation;
321327

322-
/* Create RangeTblEntry for child relation */
328+
newrelation = heap_open(childOid, NoLock);
329+
330+
/*
331+
* Create RangeTblEntry for child relation.
332+
* This code partially based on expand_inherited_rtentry() function.
333+
*/
323334
childrte = copyObject(rte);
324335
childrte->relid = childOid;
336+
childrte->relkind = newrelation->rd_rel->relkind;
325337
childrte->inh = false;
326338
childrte->requiredPerms = 0;
327339
root->parse->rtable = lappend(root->parse->rtable, childrte);
328340
childRTindex = list_length(root->parse->rtable);
329341
root->simple_rte_array[childRTindex] = childrte;
330342

331343
/* Create RelOptInfo */
332-
childrel = build_simple_rel(root, childRTindex, RELOPT_BASEREL);
344+
childrel = build_simple_rel(root, childRTindex, RELOPT_OTHER_MEMBER_REL);
345+
// childrel = build_simple_rel(root, childRTindex, RELOPT_BASEREL);
333346

334347
/* copy targetlist */
335348
childrel->reltargetlist = NIL;
@@ -380,8 +393,10 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
380393
root->append_rel_list = lappend(root->append_rel_list, appinfo);
381394
root->total_table_pages += (double) childrel->pages;
382395

383-
ereport(LOG,
384-
(errmsg("Relation %u appended", childOid)));
396+
heap_close(newrelation, NoLock);
397+
398+
// ereport(LOG,
399+
// (errmsg("Relation %u appended", childOid)));
385400
}
386401

387402
/* Convert wrapper into expression for given index */
@@ -392,7 +407,7 @@ wrapper_make_expression(WrapperNode *wrap, int index, bool *alwaysTrue)
392407

393408
*alwaysTrue = false;
394409
/*
395-
* TODO: use faster algorithm using knowledge than we enumerate indexes
410+
* TODO: use faster algorithm using knowledge that we enumerate indexes
396411
* sequntially.
397412
*/
398413
found = irange_list_find(wrap->rangeset, index, &lossy);
@@ -988,6 +1003,34 @@ set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
9881003
create_tidscan_paths(root, rel);
9891004
}
9901005

1006+
/*
1007+
* set_foreign_size
1008+
* Set size estimates for a foreign table RTE
1009+
*/
1010+
static void
1011+
set_foreign_size(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
1012+
{
1013+
/* Mark rel with estimated output rows, width, etc */
1014+
set_foreign_size_estimates(root, rel);
1015+
1016+
/* Let FDW adjust the size estimates, if it can */
1017+
rel->fdwroutine->GetForeignRelSize(root, rel, rte->relid);
1018+
1019+
/* ... but do not let it set the rows estimate to zero */
1020+
rel->rows = clamp_row_est(rel->rows);
1021+
}
1022+
1023+
/*
1024+
* set_foreign_pathlist
1025+
* Build access paths for a foreign table RTE
1026+
*/
1027+
static void
1028+
set_foreign_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
1029+
{
1030+
/* Call the FDW's GetForeignPaths function to generate path(s) */
1031+
rel->fdwroutine->GetForeignPaths(root, rel, rte->relid);
1032+
}
1033+
9911034
/*
9921035
* set_append_rel_pathlist
9931036
* Build access paths for an "append relation"
@@ -1027,8 +1070,15 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
10271070
/*
10281071
* Compute the child's access paths.
10291072
*/
1030-
// set_rel_pathlist(root, childrel, childRTindex, childRTE);
1031-
set_plain_rel_pathlist(root, childrel, childRTE);
1073+
if (childRTE->relkind == RELKIND_FOREIGN_TABLE)
1074+
{
1075+
set_foreign_size(root, childrel, childRTE);
1076+
set_foreign_pathlist(root, childrel, childRTE);
1077+
}
1078+
else
1079+
{
1080+
set_plain_rel_pathlist(root, childrel, childRTE);
1081+
}
10321082
set_cheapest(childrel);
10331083

10341084
/*

0 commit comments

Comments
 (0)