print_path is missing GatherMerge and CustomScan support

Started by Masahiko Sawadaover 7 years ago14 messages
#1Masahiko Sawada
sawada.mshk@gmail.com
1 attachment(s)

Hi,

While debugging planner I realized that print_path() function is not
aware of both GatherMerge path and CustomScan path. Attached small
patch fixes it.

Regards,

--
Masahiko Sawada
NIPPON TELEGRAPH AND TELEPHONE CORPORATION
NTT Open Source Software Center

Attachments:

fix_print_path.patchapplication/octet-stream; name=fix_print_path.patchDownload
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c
index 3ada379..eb0018b 100644
--- a/src/backend/optimizer/path/allpaths.c
+++ b/src/backend/optimizer/path/allpaths.c
@@ -3689,6 +3689,9 @@ print_path(PlannerInfo *root, Path *path, int indent)
 		case T_ForeignPath:
 			ptype = "ForeignScan";
 			break;
+		case T_CustomPath:
+			ptype = "CustomScan";
+			break;
 		case T_AppendPath:
 			ptype = "Append";
 			break;
@@ -3710,6 +3713,10 @@ print_path(PlannerInfo *root, Path *path, int indent)
 			ptype = "Gather";
 			subpath = ((GatherPath *) path)->subpath;
 			break;
+		case T_GatherMergePath:
+			ptype = "GatherMerge";
+			subpath = ((GatherMergePath *) path)->subpath;
+			break;
 		case T_ProjectionPath:
 			ptype = "Projection";
 			subpath = ((ProjectionPath *) path)->subpath;
#2Michael Paquier
michael@paquier.xyz
In reply to: Masahiko Sawada (#1)
Re: print_path is missing GatherMerge and CustomScan support

On Wed, Jul 18, 2018 at 02:35:23PM +0900, Masahiko Sawada wrote:

Hi,

While debugging planner I realized that print_path() function is not
aware of both GatherMerge path and CustomScan path. Attached small
patch fixes it.

Good catch. Those should be backpatched. While I am looking at this
stuff, I have noticed that pathnode.c/reparameterize_path_by_child uses
T_MergeAppend and not T_MergeAppendPath.

--- a/src/backend/optimizer/util/pathnode.c
+++ b/src/backend/optimizer/util/pathnode.c
@@ -3817,7 +3817,7 @@ do { \
            }
            break;
-       case T_MergeAppend:
+       case T_MergeAppendPath:
            {
                 MergeAppendPath *mapath

This is new as of f49842d1 in v11. Robert, Ashutosh, am I missing
something?
--
Michael

#3Ashutosh Bapat
ashutosh.bapat@enterprisedb.com
In reply to: Michael Paquier (#2)
Re: print_path is missing GatherMerge and CustomScan support

On Wed, Jul 18, 2018 at 11:52 AM, Michael Paquier <michael@paquier.xyz> wrote:

On Wed, Jul 18, 2018 at 02:35:23PM +0900, Masahiko Sawada wrote:

Hi,

While debugging planner I realized that print_path() function is not
aware of both GatherMerge path and CustomScan path. Attached small
patch fixes it.

Good catch. Those should be backpatched. While I am looking at this
stuff, I have noticed that pathnode.c/reparameterize_path_by_child uses
T_MergeAppend and not T_MergeAppendPath.

--- a/src/backend/optimizer/util/pathnode.c
+++ b/src/backend/optimizer/util/pathnode.c
@@ -3817,7 +3817,7 @@ do { \
}
break;
-       case T_MergeAppend:
+       case T_MergeAppendPath:
{
MergeAppendPath *mapath

This is new as of f49842d1 in v11.

Yes that's right. Thanks for taking care of it.

Robert, Ashutosh, am I missing
something?

You used my personal email id by mistake, I think. I have removed it
and added by EDB email address.

--
Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company

#4Michael Paquier
michael@paquier.xyz
In reply to: Ashutosh Bapat (#3)
Re: print_path is missing GatherMerge and CustomScan support

On Wed, Jul 18, 2018 at 12:15:25PM +0530, Ashutosh Bapat wrote:

On Wed, Jul 18, 2018 at 11:52 AM, Michael Paquier <michael@paquier.xyz> wrote:

On Wed, Jul 18, 2018 at 02:35:23PM +0900, Masahiko Sawada wrote:

Hi,

While debugging planner I realized that print_path() function is not
aware of both GatherMerge path and CustomScan path. Attached small
patch fixes it.

Good catch. Those should be backpatched. While I am looking at this
stuff, I have noticed that pathnode.c/reparameterize_path_by_child uses
T_MergeAppend and not T_MergeAppendPath.

This is new as of f49842d1 in v11.

Yes that's right. Thanks for taking care of it.

Thanks for the confirmation. Robert, do you want to take care of this
issue or should I?

Robert, Ashutosh, am I missing
something?

You used my personal email id by mistake, I think. I have removed it
and added by EDB email address.

My sincere apologies. I have not been careful.
--
Michael

#5Michael Paquier
michael@paquier.xyz
In reply to: Ashutosh Bapat (#3)
Re: print_path is missing GatherMerge and CustomScan support

On Wed, Jul 18, 2018 at 12:15:25PM +0530, Ashutosh Bapat wrote:

Yes that's right. Thanks for taking care of it.

Okay, I have pushed a fix for this one as that's wrong and
back-patched to v11. The coverage of reparameterize_path_by_child is
actually quite poor if you look at the reports:
https://coverage.postgresql.org/src/backend/optimizer/util/pathnode.c.gcov.html

Could it be possible to stress that more? This way mistakes like this
one could have been avoided from the start.
--
Michael

#6Michael Paquier
michael@paquier.xyz
In reply to: Michael Paquier (#2)
Re: print_path is missing GatherMerge and CustomScan support

On Wed, Jul 18, 2018 at 03:22:02PM +0900, Michael Paquier wrote:

Good catch. Those should be backpatched. While I am looking at this
stuff, I have noticed that pathnode.c/reparameterize_path_by_child uses
T_MergeAppend and not T_MergeAppendPath.

Okay, I have checked the full list of path nodes and the two ones you
mentioned are the only missing. CustomPath has been added in 9.5, so
this has been patched down to this version. GatherMergePath is new as
of 10.

The order of the items in print_path and nodes.h was a bit messed up as
well which made unnecessarily harder to check the list, so I fixed the
order at the same time to ease future lookups and back-patching effort.
--
Michael

#7Ashutosh Bapat
ashutosh.bapat@enterprisedb.com
In reply to: Michael Paquier (#5)
Re: print_path is missing GatherMerge and CustomScan support

On Thu, Jul 19, 2018 at 5:37 AM, Michael Paquier <michael@paquier.xyz> wrote:

On Wed, Jul 18, 2018 at 12:15:25PM +0530, Ashutosh Bapat wrote:

Yes that's right. Thanks for taking care of it.

Okay, I have pushed a fix for this one as that's wrong and
back-patched to v11. The coverage of reparameterize_path_by_child is
actually quite poor if you look at the reports:
https://coverage.postgresql.org/src/backend/optimizer/util/pathnode.c.gcov.html

Could it be possible to stress that more? This way mistakes like this
one could have been avoided from the start.

I had extensive testcases in my original patch-set to exercise that
code but 1. that testset was too extensive; even today
partition_join.sql is a separate testcase and it's quite large. 2.
that function returns NULL rather than throwing an error, if it can
not produce a parameterized path. So, unless we check whether each of
those paths get created no test is useful and that can only be done
through an EXPLAIN OUTPUT which means that the testcase becomes
fragile. I fine if we want to add more tests just to cover the code if
those are not as fragile and do not blow up partition_join too much.

--
Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company

#8Michael Paquier
michael@paquier.xyz
In reply to: Ashutosh Bapat (#7)
Re: print_path is missing GatherMerge and CustomScan support

On Thu, Jul 19, 2018 at 10:41:10AM +0530, Ashutosh Bapat wrote:

I had extensive testcases in my original patch-set to exercise that
code but 1. that testset was too extensive; even today
partition_join.sql is a separate testcase and it's quite large. 2.
that function returns NULL rather than throwing an error, if it can
not produce a parameterized path. So, unless we check whether each of
those paths get created no test is useful and that can only be done
through an EXPLAIN OUTPUT which means that the testcase becomes
fragile. I fine if we want to add more tests just to cover the code if
those are not as fragile and do not blow up partition_join too much.

Did those really check the reparameterization of a MergeAppendPath for a
child of the parent? I'd be surprised if this one was stressed as there
was no match in the list.
--
Michael

#9Ashutosh Bapat
ashutosh.bapat@enterprisedb.com
In reply to: Michael Paquier (#8)
Re: print_path is missing GatherMerge and CustomScan support

On Thu, Jul 19, 2018 at 11:56 AM, Michael Paquier <michael@paquier.xyz> wrote:

On Thu, Jul 19, 2018 at 10:41:10AM +0530, Ashutosh Bapat wrote:

I had extensive testcases in my original patch-set to exercise that
code but 1. that testset was too extensive; even today
partition_join.sql is a separate testcase and it's quite large. 2.
that function returns NULL rather than throwing an error, if it can
not produce a parameterized path. So, unless we check whether each of
those paths get created no test is useful and that can only be done
through an EXPLAIN OUTPUT which means that the testcase becomes
fragile. I fine if we want to add more tests just to cover the code if
those are not as fragile and do not blow up partition_join too much.

Did those really check the reparameterization of a MergeAppendPath for a
child of the parent? I'd be surprised if this one was stressed as there
was no match in the list.

I don't remember but given this evident, it was not. But there are
some testcases in partition_join which test this code using LATERAL
joins. But those do not cover the entire function.

--
Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company

#10Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Michael Paquier (#6)
Re: print_path is missing GatherMerge and CustomScan support

On Thu, Jul 19, 2018 at 9:58 AM, Michael Paquier <michael@paquier.xyz> wrote:

On Wed, Jul 18, 2018 at 03:22:02PM +0900, Michael Paquier wrote:

Good catch. Those should be backpatched. While I am looking at this
stuff, I have noticed that pathnode.c/reparameterize_path_by_child uses
T_MergeAppend and not T_MergeAppendPath.

Okay, I have checked the full list of path nodes and the two ones you
mentioned are the only missing. CustomPath has been added in 9.5, so
this has been patched down to this version. GatherMergePath is new as
of 10.

The order of the items in print_path and nodes.h was a bit messed up as
well which made unnecessarily harder to check the list, so I fixed the
order at the same time to ease future lookups and back-patching effort.

Thank you for committing the patch!

Regards,

--
Masahiko Sawada
NIPPON TELEGRAPH AND TELEPHONE CORPORATION
NTT Open Source Software Center

#11Etsuro Fujita
fujita.etsuro@lab.ntt.co.jp
In reply to: Ashutosh Bapat (#7)
Re: print_path is missing GatherMerge and CustomScan support

(2018/07/19 14:11), Ashutosh Bapat wrote:

On Thu, Jul 19, 2018 at 5:37 AM, Michael Paquier<michael@paquier.xyz> wrote:

On Wed, Jul 18, 2018 at 12:15:25PM +0530, Ashutosh Bapat wrote:

Yes that's right. Thanks for taking care of it.

Okay, I have pushed a fix for this one as that's wrong and
back-patched to v11. The coverage of reparameterize_path_by_child is
actually quite poor if you look at the reports:
https://coverage.postgresql.org/src/backend/optimizer/util/pathnode.c.gcov.html

Could it be possible to stress that more? This way mistakes like this
one could have been avoided from the start.

I had extensive testcases in my original patch-set to exercise that
code but 1. that testset was too extensive; even today
partition_join.sql is a separate testcase and it's quite large. 2.
that function returns NULL rather than throwing an error, if it can
not produce a parameterized path. So, unless we check whether each of
those paths get created no test is useful and that can only be done
through an EXPLAIN OUTPUT which means that the testcase becomes
fragile. I fine if we want to add more tests just to cover the code if
those are not as fragile and do not blow up partition_join too much.

It would not be possible to cover these cases:

case T_GatherPath:
{
GatherPath *gpath;

FLAT_COPY_PATH(gpath, path, GatherPath);
REPARAMETERIZE_CHILD_PATH(gpath->subpath);
new_path = (Path *) gpath;
}
break;

case T_GatherMergePath:
{
GatherMergePath *gmpath;

FLAT_COPY_PATH(gmpath, path, GatherMergePath);
REPARAMETERIZE_CHILD_PATH(gmpath->subpath);
new_path = (Path *) gmpath;
}
break;

because we currently don't consider gathering partial child-scan or
child-join paths. I think we might consider that in future, though.

Best regards,
Etsuro Fujita

#12Robert Haas
robertmhaas@gmail.com
In reply to: Etsuro Fujita (#11)
Re: print_path is missing GatherMerge and CustomScan support

On Thu, Jul 26, 2018 at 1:14 AM, Etsuro Fujita
<fujita.etsuro@lab.ntt.co.jp> wrote:

because we currently don't consider gathering partial child-scan or
child-join paths. I think we might consider that in future, though.

You generally want to put the Gather node as high up in the plan tree
as possible. I think the only case in which this is beneficial is if
you can't put the Gather or Gather Merge node above the Append because
only some of the children are parallel-safe. In that case, a separate
Gather per child can be better than no parallelism at all. It's a
rare case, but it can happen. Actually, I thought we had code for this
already: see the end of apply_scanjoin_target_to_paths().

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

#13Etsuro Fujita
fujita.etsuro@lab.ntt.co.jp
In reply to: Robert Haas (#12)
Re: print_path is missing GatherMerge and CustomScan support

(2018/07/27 4:50), Robert Haas wrote:

On Thu, Jul 26, 2018 at 1:14 AM, Etsuro Fujita
<fujita.etsuro@lab.ntt.co.jp> wrote:

because we currently don't consider gathering partial child-scan or
child-join paths. I think we might consider that in future, though.

You generally want to put the Gather node as high up in the plan tree
as possible. I think the only case in which this is beneficial is if
you can't put the Gather or Gather Merge node above the Append because
only some of the children are parallel-safe. In that case, a separate
Gather per child can be better than no parallelism at all. It's a
rare case, but it can happen. Actually, I thought we had code for this
already: see the end of apply_scanjoin_target_to_paths().

Agreed. Thanks for the explanation!

(I think that at least currently, there is no need for the Gather and
GatherMerge cases in reparameterize_path_by_child, but I don't object to
keeping those as-is there.)

Best regards,
Etsuro Fujita

#14Michael Paquier
michael@paquier.xyz
In reply to: Etsuro Fujita (#13)
Re: print_path is missing GatherMerge and CustomScan support

On Fri, Jul 27, 2018 at 03:40:48PM +0900, Etsuro Fujita wrote:

(I think that at least currently, there is no need for the Gather and
GatherMerge cases in reparameterize_path_by_child, but I don't object to
keeping those as-is there.)

Let's keep them. As far as my understanding goes, which is way lower
than any of you by the way, those don't hurt and would automatically
help.
--
Michael