> >  BTW, why aren't you using the tlist passed to this function? I guess
> >> create_scan_plan() passes tlist after processing it, so that should be
> >> used rather than rel->reltargetlist.
> >>
> >
> > I think that that would be maybe OK, but I think that it would not be
> > efficient to use the list to compute attrs_used, because the tlist would
> > have more information than rel->reltargetlist in cases where the tlist is
> > build through build_physical_tlist().
> >
> >
> In that case, we can call build_relation_tlist() for foreign tables.

# is it build_base_rel_tilst() ?

It needs only one effective line added, which would be seemingly
far simple ingoring potential extra calculation for non-child
relations (I suppose getting rid of it needs a foreach on
rel->append_rel_list..) and too-longer physical tlist.  On the
other hand build_relation_tlist() and this patch seem to be in
the same order of computational complexity for the length of the

I prefer to use build_base_rel_tlist() for the clarity of
code. But I don't know how high the chance to big physical tlist
and non-child relations become to be an annoyance. Is there any

By the way, I tried xmin and xmax for the file_fdw tables.

postgres=# select tableoid, xmin, xmax, * from passwd1;
tableoid | xmin |    xmax    |     uname     | pass |  uid  |  gid  | .. 
   16396 |  244 | 4294967295 | root          | x    |     0 |     0 | root...
   16396 |  252 | 4294967295 | bin           | x    |     1 |     1 | bin...
   16396 |  284 | 4294967295 | daemon        | x    |     2 |     2 | daemon...

The xmin and xmax apparently doesn't look sane. After some
investigation, I found that they came from the following place in
heap_form_tuple(), (call stach is show below)

| HeapTupleHeaderSetDatumLength(td, len);
| HeapTupleHeaderSetTypeId(td, tupleDescriptor->tdtypeid);
| HeapTupleHeaderSetTypMod(td, tupleDescriptor->tdtypmod);

HeapTupleHeader is a union of HeapTupleFields and
DatumTupleFields and these macors seem to treat it as the
latter. Then later this tuple seems to be read as the former so
xmin and xmax should have that values.

This seems to be a bug. But I have no idea how to deal with it
for now. I'll take more look into this.

The call stack onto the above heap_form_tuple is as follows.

#0  heap_form_tuple (tupleDescriptor=0x7fc46d2953a8, values=0x10dd1a0, 
isnull=0x10dd1f8 "") at heaptuple.c:731
#1  ExecCopySlotTuple (slot=0x10dd0e0) at execTuples.c:574
#2  ExecMaterializeSlot (slot=0x10dd0e0) at execTuples.c:760
#3  ForeignNext (node=0x10dc7b0) at nodeForeignscan.c:61
#4  ExecScanFetch (node=0x10dc7b0, accessMtd=0x66599c <ForeignNext>, 
recheckMtd=0x665a43 <ForeignRecheck>) at execScan.c:82
#5  ExecScan (node=0x10dc7b0, accessMtd=0x66599c <ForeignNext>, 
recheckMtd=0x665a43 <ForeignRecheck>) at execScan.c:167
#6  ExecForeignScan (node=0x10dc7b0) at nodeForeignscan.c:91
#7  ExecProcNode (node=0x10dc7b0) at execProcnode.c:442


Kyotaro Horiguchi
NTT Open Source Software Center

Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:

Reply via email to