Re: [HACKERS] fdw_scan_tlist for foreign table scans breaks EPQ testing, doesn't it?

2015-07-24 Thread Kouhei Kaigai




 -Original Message-
 From: Robert Haas [mailto:robertmh...@gmail.com]
 Sent: Saturday, July 25, 2015 2:59 AM
 To: Kaigai Kouhei(海外 浩平)
 Cc: Etsuro Fujita; pgsql-hackers@postgresql.org
 Subject: ##freemail## Re: [HACKERS] fdw_scan_tlist for foreign table scans 
 breaks
 EPQ testing, doesn't it?
 
 On Thu, Jul 23, 2015 at 8:27 PM, Kouhei Kaigai kai...@ak.jp.nec.com wrote:
  A dark side is, as discussed in this thread, complexity of EvalPlanQual.
  RefetchForeignRow() returns a tuple based on foreign table definition,
  on the other hands, whole-row var points a tuple based on fdw_scan_tlist
  if exists.
  An alternative host-only plan-node and relevant expression will be
  constructed towards the definition of base foreign-table. So, we need to
  transform the tuple to the layout based on foreign table definition if
  we allow fdw_scan_tlist with scanrelid  0.
 
  However, I'm skeptical whether this solution is valid for long term.
  Once we support to push down expensive expression in target-list to
  remote side, fdw_scan_tlist will contain expression node rather than
  simple Var node. In this case, it is not obvious to reproduce a tuple
  according to the foreign table definition from a record based on the
  fdw_scan_tlist.
 
 I don't think we can realistically make a decision that pushing down
 target list expressions to the remote side is forever off the table.
 
 Is the problem here that it's not *possible* for an FDW to do the
 right thing, or just that it might be difficult to code in practice?
 I'm fuzzy on why this isn't just a matter of having
 RefetchForeignRow() return a row with the correct tuple descriptor.

RefetchForeignRow() does not take ForeignScanState argument that
knows how remote data is represented on the local side if valid
fdw_scan_tlist is configured.
Do we have no facility to lookup ScanState object by scanrelid on
execution time, don't it?

On the other hands, I'm inclined to think FDW driver should provide
alternative whole-row reference (according to the base foreign-table
definition) if it has a valid fdw_scan_tlist
It is more suitable on join pushdown cases, because the alternative
subplan (to be executed instead of the remote query) assumes all the
EPQ tuples follows base table definitions as usual.

Is it not easy to inject a junk TLE to reference a whole-row variable
based on the foreign table definition?

Thanks,
--
NEC Business Creation Division / PG-Strom Project
KaiGai Kohei kai...@ak.jp.nec.com

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


Re: [HACKERS] fdw_scan_tlist for foreign table scans breaks EPQ testing, doesn't it?

2015-07-23 Thread Kouhei Kaigai
 On Wed, Jul 22, 2015 at 8:24 PM, Kouhei Kaigai kai...@ak.jp.nec.com wrote:
  Indeed, this commit allows ForeignScan to have fdw_scan_tlist, even if
  scanrelid  0, however, I'm uncertain about its reason/intention.
  Does it a preparation for the upcoming target-list-pushdown??
 
 I guess Tom would have to comment on whether it could be used for that
 purpose.  I assume that omitting columns could be interesting for some
 FDWs, if nothing else.

Indeed. As current postgres_fdw doing, FDW driver puts dummy NULLs
on unreferenced columns for network optimization, however, it shall
become unnecessary if we can change definition of the expected
record-type of foreign-table. Its advantage is more human readable
remote query and less CPU cycle for projection.

A dark side is, as discussed in this thread, complexity of EvalPlanQual.
RefetchForeignRow() returns a tuple based on foreign table definition,
on the other hands, whole-row var points a tuple based on fdw_scan_tlist
if exists.
An alternative host-only plan-node and relevant expression will be
constructed towards the definition of base foreign-table. So, we need to
transform the tuple to the layout based on foreign table definition if
we allow fdw_scan_tlist with scanrelid  0.

However, I'm skeptical whether this solution is valid for long term.
Once we support to push down expensive expression in target-list to
remote side, fdw_scan_tlist will contain expression node rather than
simple Var node. In this case, it is not obvious to reproduce a tuple
according to the foreign table definition from a record based on the
fdw_scan_tlist.

So, I'm inclined to prohibit to set fdw_scan_tlist/custom_scan_tlist
for actual scan node (scanrelid  0), at present.

Thanks,
--
NEC Business Creation Division / PG-Strom Project
KaiGai Kohei kai...@ak.jp.nec.com

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


Re: [HACKERS] fdw_scan_tlist for foreign table scans breaks EPQ testing, doesn't it?

2015-07-23 Thread Robert Haas
On Wed, Jul 22, 2015 at 8:24 PM, Kouhei Kaigai kai...@ak.jp.nec.com wrote:
 Indeed, this commit allows ForeignScan to have fdw_scan_tlist, even if
 scanrelid  0, however, I'm uncertain about its reason/intention.
 Does it a preparation for the upcoming target-list-pushdown??

I guess Tom would have to comment on whether it could be used for that
purpose.  I assume that omitting columns could be interesting for some
FDWs, if nothing else.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


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


Re: [HACKERS] fdw_scan_tlist for foreign table scans breaks EPQ testing, doesn't it?

2015-07-22 Thread Kouhei Kaigai
Fujita-san,

Sorry for my late response.

 The latest foreign-join pushdown patch allows fdw_scan_tlist to be set
 to a targetlist even for simple foreign table scans.  However, since I
 think we assume that the test tuple of a foreign table for an EPQ
 testing, whether it may be copied from the whole-row var or returned by
 the RefetchForeignRow routine, has the rowtype declared for the foreign
 table, ISTM that EPQ testing doesn't work properly in such a case since
 that the targetlist and qual are adjusted to reference fdw_scan_tlist in
 such a case.  Maybe I'm missing something though.

Let me confirm step-by-step.
For EPQ testing, whole-row-reference or RefetchForeignRow pulls a record
with row-type compatible to the base foreign table. Then, this record
is stored in the es_epqTuple[] indexed by the base relation.

According to the previous discussion, I expect these tuples are re-checked
by built-in execution plan, but equivalent to the sub-plan entirely pushed
out to the remote side.
Do we see the same assumption?

If so, next step is enhancement of ExecScanFetch() to run the alternative
built-in plans towards each es_epqTuple[] records, if given scanrelid==0.
In this case, expression nodes adjusted to fdw_scan_tlist never called,
so it should not lead any problems...?

 I don't understand custom scans/joins exactly, but I have a similar
 concern for the simple-custom-scan case too.

In case of custom scan/join, it fetches a record using heap_fetch()
identified by ctid, and saved to es_epqTuple[].
Then, EvalPlanQual() walks down the plan-tree. Once it appears a node
of custom-join (scanrelid==0), it shall call the equivalent alternatives
if possible, or calls ExecProcNode() towards the underlying nodes then
re-construct its result according to the custom_scan_tlist definition.

It does not look to me problematic.

Thanks,
--
NEC Business Creation Division / PG-Strom Project
KaiGai Kohei kai...@ak.jp.nec.com


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


Re: [HACKERS] fdw_scan_tlist for foreign table scans breaks EPQ testing, doesn't it?

2015-07-22 Thread Etsuro Fujita
Hi KaiGai-san,

On 2015/07/22 16:44, Kouhei Kaigai wrote:
 The latest foreign-join pushdown patch allows fdw_scan_tlist to be set
 to a targetlist even for simple foreign table scans.  However, since I
 think we assume that the test tuple of a foreign table for an EPQ
 testing, whether it may be copied from the whole-row var or returned by
 the RefetchForeignRow routine, has the rowtype declared for the foreign
 table, ISTM that EPQ testing doesn't work properly in such a case since
 that the targetlist and qual are adjusted to reference fdw_scan_tlist in
 such a case.  Maybe I'm missing something though.

 Let me confirm step-by-step.
 For EPQ testing, whole-row-reference or RefetchForeignRow pulls a record
 with row-type compatible to the base foreign table. Then, this record
 is stored in the es_epqTuple[] indexed by the base relation.
 
 According to the previous discussion, I expect these tuples are re-checked
 by built-in execution plan, but equivalent to the sub-plan entirely pushed
 out to the remote side.
 Do we see the same assumption?

No, what I'm concerned about is the case when scanrelid  0.

 If so, next step is enhancement of ExecScanFetch() to run the alternative
 built-in plans towards each es_epqTuple[] records, if given scanrelid==0.
 In this case, expression nodes adjusted to fdw_scan_tlist never called,
 so it should not lead any problems...?

When scanrelid = 0, I think we should run the alternative plans in
ExecScanFetch or somewhere, as you mentioned.

 I don't understand custom scans/joins exactly, but I have a similar
 concern for the simple-custom-scan case too.

 In case of custom scan/join, it fetches a record using heap_fetch()
 identified by ctid, and saved to es_epqTuple[].
 Then, EvalPlanQual() walks down the plan-tree. Once it appears a node
 of custom-join (scanrelid==0), it shall call the equivalent alternatives
 if possible, or calls ExecProcNode() towards the underlying nodes then
 re-construct its result according to the custom_scan_tlist definition.
 
 It does not look to me problematic.

Sorry, I don't understand what you mean.  Maybe I have to learn more
about custom scans/joins, but thanks for the explanation!

Best regards,
Etsuro Fujita


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


Re: [HACKERS] fdw_scan_tlist for foreign table scans breaks EPQ testing, doesn't it?

2015-07-22 Thread Kouhei Kaigai
 -Original Message-
 From: Etsuro Fujita [mailto:fujita.ets...@lab.ntt.co.jp]
 Sent: Wednesday, July 22, 2015 7:05 PM
 To: Kaigai Kouhei(海外 浩平)
 Cc: pgsql-hackers@postgresql.org
 Subject: Re: [HACKERS] fdw_scan_tlist for foreign table scans breaks EPQ 
 testing,
 doesn't it?
 
 Hi KaiGai-san,
 
 On 2015/07/22 16:44, Kouhei Kaigai wrote:
  The latest foreign-join pushdown patch allows fdw_scan_tlist to be set
  to a targetlist even for simple foreign table scans.  However, since I
  think we assume that the test tuple of a foreign table for an EPQ
  testing, whether it may be copied from the whole-row var or returned by
  the RefetchForeignRow routine, has the rowtype declared for the foreign
  table, ISTM that EPQ testing doesn't work properly in such a case since
  that the targetlist and qual are adjusted to reference fdw_scan_tlist in
  such a case.  Maybe I'm missing something though.
 
  Let me confirm step-by-step.
  For EPQ testing, whole-row-reference or RefetchForeignRow pulls a record
  with row-type compatible to the base foreign table. Then, this record
  is stored in the es_epqTuple[] indexed by the base relation.
 
  According to the previous discussion, I expect these tuples are re-checked
  by built-in execution plan, but equivalent to the sub-plan entirely pushed
  out to the remote side.
  Do we see the same assumption?
 
 No, what I'm concerned about is the case when scanrelid  0.

Hmm. if scanrelid  0, then fdw_scan_tlist should be NIL.
I want to put Assert(scanrelid==0 || fdw_scan_tlist == NIL) just after
the GetForeignPlan() in createplan.c.

I'm curious why you tried to put valid fdw_scan_tlist for scanrelid  0.
It's unusual.

  If so, next step is enhancement of ExecScanFetch() to run the alternative
  built-in plans towards each es_epqTuple[] records, if given scanrelid==0.
  In this case, expression nodes adjusted to fdw_scan_tlist never called,
  so it should not lead any problems...?
 
 When scanrelid = 0, I think we should run the alternative plans in
 ExecScanFetch or somewhere, as you mentioned.

OK,

  I don't understand custom scans/joins exactly, but I have a similar
  concern for the simple-custom-scan case too.
 
  In case of custom scan/join, it fetches a record using heap_fetch()
  identified by ctid, and saved to es_epqTuple[].
  Then, EvalPlanQual() walks down the plan-tree. Once it appears a node
  of custom-join (scanrelid==0), it shall call the equivalent alternatives
  if possible, or calls ExecProcNode() towards the underlying nodes then
  re-construct its result according to the custom_scan_tlist definition.
 
  It does not look to me problematic.
 
 Sorry, I don't understand what you mean.  Maybe I have to learn more
 about custom scans/joins, but thanks for the explanation!

--
NEC Business Creation Division / PG-Strom Project
KaiGai Kohei kai...@ak.jp.nec.com


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


Re: [HACKERS] fdw_scan_tlist for foreign table scans breaks EPQ testing, doesn't it?

2015-07-22 Thread Kouhei Kaigai
 -Original Message-
 From: pgsql-hackers-ow...@postgresql.org
 [mailto:pgsql-hackers-ow...@postgresql.org] On Behalf Of Robert Haas
 Sent: Wednesday, July 22, 2015 11:19 PM
 To: Kaigai Kouhei(海外 浩平)
 Cc: Etsuro Fujita; pgsql-hackers@postgresql.org
 Subject: Re: [HACKERS] fdw_scan_tlist for foreign table scans breaks EPQ 
 testing,
 doesn't it?
 
 On Wed, Jul 22, 2015 at 8:13 AM, Kouhei Kaigai kai...@ak.jp.nec.com wrote:
  No, what I'm concerned about is the case when scanrelid  0.
 
  Hmm. if scanrelid  0, then fdw_scan_tlist should be NIL.
  I want to put Assert(scanrelid==0 || fdw_scan_tlist == NIL) just after
  the GetForeignPlan() in createplan.c.
 
  I'm curious why you tried to put valid fdw_scan_tlist for scanrelid  0.
  It's unusual.
 
 Allowing that was part of the point of Tom Lane's commit
 1a8a4e5cde2b7755e11bde2ea7897bd650622d3e.  See the second bullet
 point, after the comma.

Indeed, this commit allows ForeignScan to have fdw_scan_tlist, even if
scanrelid  0, however, I'm uncertain about its reason/intention.
Does it a preparation for the upcoming target-list-pushdown??

Thanks,
--
NEC Business Creation Division / PG-Strom Project
KaiGai Kohei kai...@ak.jp.nec.com


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


Re: [HACKERS] fdw_scan_tlist for foreign table scans breaks EPQ testing, doesn't it?

2015-07-22 Thread Robert Haas
On Wed, Jul 22, 2015 at 8:13 AM, Kouhei Kaigai kai...@ak.jp.nec.com wrote:
 No, what I'm concerned about is the case when scanrelid  0.

 Hmm. if scanrelid  0, then fdw_scan_tlist should be NIL.
 I want to put Assert(scanrelid==0 || fdw_scan_tlist == NIL) just after
 the GetForeignPlan() in createplan.c.

 I'm curious why you tried to put valid fdw_scan_tlist for scanrelid  0.
 It's unusual.

Allowing that was part of the point of Tom Lane's commit
1a8a4e5cde2b7755e11bde2ea7897bd650622d3e.  See the second bullet
point, after the comma.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


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