Re: set_cheapest without checking pathlist

2024-02-01 Thread James Coleman
On Thu, Feb 1, 2024 at 1:36 AM Richard Guo  wrote:
>
>
> On Thu, Feb 1, 2024 at 11:37 AM David Rowley  wrote:
>>
>> On Thu, 1 Feb 2024 at 16:29, Richard Guo  wrote:
>> > On Thu, Feb 1, 2024 at 10:04 AM James Coleman  wrote:
>> >> I don't see any inherent reason why we must always assume that
>> >> gather_grouping_paths will always result in having at least one entry
>> >> in pathlist. If, for example, we've disabled incremental sort and the
>> >> cheapest partial path happens to already be sorted, then I don't
>> >> believe we'll add any paths. And if that happens then set_cheapest
>> >> will error with the message "could not devise a query plan for the
>> >> given query". So I propose we add a similar guard to this call point.
>> >
>> >
>> > I don't believe that would happen.  It seems to me that we should, at
>> > the very least, have a path which is Gather on top of the cheapest
>> > partial path (see generate_gather_paths), as long as the
>> > partially_grouped_rel has partial paths.
>>
>> It will have partial paths because it's nested inside "if
>> (partially_grouped_rel && partially_grouped_rel->partial_pathlist)"
>
>
> Right.  And that leads to the conclusion that gather_grouping_paths will
> always generate at least one path for partially_grouped_rel.  So it
> seems to me that the check added in the patch is not necessary.  But
> maybe we can add an Assert or a comment clarifying that the pathlist of
> partially_grouped_rel cannot be empty here.

Yes, that's true currently. I don't particularly love that we have the
knowledge of that baked in at this level, but it won't break anything
currently.

I'll put this as a patch in the parallelization patch series
referenced earlier since in that series my changes result in
generate_gather_paths() not necessarily always being able to build a
path.

Regards,
James Coleman




Re: set_cheapest without checking pathlist

2024-02-01 Thread Richard Guo
On Thu, Feb 1, 2024 at 5:03 PM David Rowley  wrote:

> On Thu, 1 Feb 2024 at 19:36, Richard Guo  wrote:
> > maybe we can add an Assert or a comment clarifying that the pathlist of
> > partially_grouped_rel cannot be empty here.
>
> There'd be no need to Assert that as set_cheapest() will raise an
> error when given a rel with an empty pathlist.
>
> I don't think putting an Assert that would fail in the same situation
> that we'd later ERROR out on would be a good idea. It'd make it harder
> to debug the issue.


Fair point.

Thanks
Richard


Re: set_cheapest without checking pathlist

2024-02-01 Thread David Rowley
On Thu, 1 Feb 2024 at 19:36, Richard Guo  wrote:
> maybe we can add an Assert or a comment clarifying that the pathlist of
> partially_grouped_rel cannot be empty here.

There'd be no need to Assert that as set_cheapest() will raise an
error when given a rel with an empty pathlist.

I don't think putting an Assert that would fail in the same situation
that we'd later ERROR out on would be a good idea. It'd make it harder
to debug the issue.

David




Re: set_cheapest without checking pathlist

2024-01-31 Thread Richard Guo
On Thu, Feb 1, 2024 at 11:37 AM David Rowley  wrote:

> On Thu, 1 Feb 2024 at 16:29, Richard Guo  wrote:
> > On Thu, Feb 1, 2024 at 10:04 AM James Coleman  wrote:
> >> I don't see any inherent reason why we must always assume that
> >> gather_grouping_paths will always result in having at least one entry
> >> in pathlist. If, for example, we've disabled incremental sort and the
> >> cheapest partial path happens to already be sorted, then I don't
> >> believe we'll add any paths. And if that happens then set_cheapest
> >> will error with the message "could not devise a query plan for the
> >> given query". So I propose we add a similar guard to this call point.
> >
> >
> > I don't believe that would happen.  It seems to me that we should, at
> > the very least, have a path which is Gather on top of the cheapest
> > partial path (see generate_gather_paths), as long as the
> > partially_grouped_rel has partial paths.
>
> It will have partial paths because it's nested inside "if
> (partially_grouped_rel && partially_grouped_rel->partial_pathlist)"


Right.  And that leads to the conclusion that gather_grouping_paths will
always generate at least one path for partially_grouped_rel.  So it
seems to me that the check added in the patch is not necessary.  But
maybe we can add an Assert or a comment clarifying that the pathlist of
partially_grouped_rel cannot be empty here.

Thanks
Richard


Re: set_cheapest without checking pathlist

2024-01-31 Thread David Rowley
On Thu, 1 Feb 2024 at 16:29, Richard Guo  wrote:
>
>
> On Thu, Feb 1, 2024 at 10:04 AM James Coleman  wrote:
>>
>> I don't see any inherent reason why we must always assume that
>> gather_grouping_paths will always result in having at least one entry
>> in pathlist. If, for example, we've disabled incremental sort and the
>> cheapest partial path happens to already be sorted, then I don't
>> believe we'll add any paths. And if that happens then set_cheapest
>> will error with the message "could not devise a query plan for the
>> given query". So I propose we add a similar guard to this call point.
>
>
> I don't believe that would happen.  It seems to me that we should, at
> the very least, have a path which is Gather on top of the cheapest
> partial path (see generate_gather_paths), as long as the
> partially_grouped_rel has partial paths.

It will have partial paths because it's nested inside "if
(partially_grouped_rel && partially_grouped_rel->partial_pathlist)"

David




Re: set_cheapest without checking pathlist

2024-01-31 Thread Richard Guo
On Thu, Feb 1, 2024 at 10:04 AM James Coleman  wrote:

> I don't see any inherent reason why we must always assume that
> gather_grouping_paths will always result in having at least one entry
> in pathlist. If, for example, we've disabled incremental sort and the
> cheapest partial path happens to already be sorted, then I don't
> believe we'll add any paths. And if that happens then set_cheapest
> will error with the message "could not devise a query plan for the
> given query". So I propose we add a similar guard to this call point.


I don't believe that would happen.  It seems to me that we should, at
the very least, have a path which is Gather on top of the cheapest
partial path (see generate_gather_paths), as long as the
partially_grouped_rel has partial paths.

Thanks
Richard