On Thu, 1 Jul 2021 at 21:11, David Rowley <dgrowleyml@gmail.com> wrote: > 1) Unsure of the API to the prosupport function. I wonder if the > prosupport function should just be able to say if the function is > either monotonically increasing or decreasing or neither then have > core code build a qual. That would make the job of building new > functions easier, but massively reduce the flexibility of the feature. > I'm just not sure it needs to do more in the future.
I looked at this patch again today and ended up changing the API that I'd done for the prosupport functions. These just now set a new "monotonic" field in the (also newly renamed) SupportRequestWFuncMonotonic struct. This can be set to one of the values from the newly added MonotonicFunction enum, namely: MONOTONICFUNC_NONE, MONOTONICFUNC_INCREASING, MONOTONICFUNC_DECREASING or MONOTONICFUNC_BOTH.
I also added handling for a few more cases that are perhaps rare but could be done with just a few lines of code. For example; COUNT(*) OVER() is MONOTONICFUNC_BOTH as it can neither increase nor decrease for a given window partition. I think technically all of the standard set of aggregate functions could have a prosupport function to handle that case. Min() and Max() could go a little further, but I'm not sure if adding handling for that would be worth it, and if someone does think that it is worth it, then I'd rather do that as a separate patch.
I put the MonotonicFunction enum in plannodes.h. There's nothing specific about window functions or support functions. It could, for example, be reused again for something else such as monotonic set-returning functions.
One thing which I'm still not sure about is where find_window_run_conditions() should be located. Currently, it's in allpaths.c but that does not really feel like the right place to me. We do have planagg.c in src/backend/optimizer/plan, maybe we need planwindow.c?
David
Hi,
+ if ((res->monotonic & MONOTONICFUNC_INCREASING) == MONOTONICFUNC_INCREASING)
The above can be simplified as 'if (res->monotonic & MONOTONICFUNC_INCREASING) '