Re: Odd system-column handling in postgres_fdw join pushdown patch
| От | Etsuro Fujita |
|---|---|
| Тема | Re: Odd system-column handling in postgres_fdw join pushdown patch |
| Дата | |
| Msg-id | 570F08D2.6020108@lab.ntt.co.jp обсуждение исходный текст |
| Ответ на | Re: Odd system-column handling in postgres_fdw join pushdown patch (Robert Haas <robertmhaas@gmail.com>) |
| Ответы |
Re: Odd system-column handling in postgres_fdw join
pushdown patch
|
| Список | pgsql-hackers |
On 2016/04/14 4:57, Robert Haas wrote: > On Wed, Apr 13, 2016 at 2:36 PM, Robert Haas <robertmhaas@gmail.com> wrote: >> On Wed, Apr 13, 2016 at 2:11 PM, Robert Haas <robertmhaas@gmail.com> wrote: >>> So, clearly that's not good. It should at least be consistent. But >>> more than that, the fact that postgres_fdw sets the xmax to 0xffffffff >>> is also pretty wacky. We might use such a value as a sentinel for >>> some data type, but for transaction IDs that's just some random normal >>> transaction ID, and it's NOT coming from t1. I haven't tracked down >>> where it *is* coming from yet, but can't imagine it's any place very >>> principled. >> >> And, yeah, it's not very principled. >> >> rhaas=# select ft1.xmin, ft1.xmax, ft1.cmin from ft1; >> xmin | xmax | cmin >> ------+------------+------- >> 96 | 4294967295 | 16392 >> 96 | 4294967295 | 16392 >> 96 | 4294967295 | 16392 >> 96 | 4294967295 | 16392 >> (4 rows) >> >> What's happening here is that heap_getattr() is being applied to a >> HeapTupleHeaderData which contains DatumTupleFields. So 96 is >> datum_len_, 4294967295 is the -1 recorded in datum_typmod, and 16392 >> is the compose type OID recorded in datum_typeid, which happens in >> this case to be the OID of ft1. Isn't that special? >> >> It's hard for me to view this as anything other than a bug in >> postgres_fdw - which of course means that this open item boils down to >> the complaint that the way system columns are handled by join pushdown >> isn't bug-compatible with the existing behavior.... > OK, here's a patch. What I did is: Thank you for taking care of this. > 1. For a regular FDW scan, zero the xmin, xmax, and cid of the tuple > before returning it from postgres_fdw, so that we don't expose the > datum-tuple fields. I can't see any reason this isn't safe, but I > might be missing something. I'm not sure that is really safe. > 2. When a join is pushed down, deparse system columns using something > like "CASE WHEN r1.* IS NOT NULL THEN 0 END", except for the table OID > column, which gets deparsed with the table OID in place of 0. This > delivers the correct behavior in the presence of outer joins. I think that that would cause useless data transfer for such culumns. Why not set values locally for such columns? Best regards, Etsuro Fujita
В списке pgsql-hackers по дате отправления: