On Mon, Aug 16, 2021 at 3:28 AM David Rowley <dgrowle...@gmail.com> wrote:
> On Thu, 1 Jul 2021 at 21:11, David Rowley <dgrowle...@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) ' Cheers