> On 26 Jun 2018, at 17:11, Alexander Kuzmenkov <[email protected]> > wrote:
> I took a look at the patch. It applies and compiles, the tests pass.
Thanks for reviewing, and apologies for the slow response.
> Some thoughts about the code:
>
> * Postgres lists cache their lengths, so you don't need uniqueLen.
Good point, fixed.
> * Use an array of WindowClauseSortNode's instead of a list. It's more
> suitable here because you are going to sort (qsort_list creates a temporary
> array).
I was thinking about that, but opted for code simplicity with a List approach.
The required size of the array isn’t known ahead of time, so it must either
potentially overallocate to the upper bound of root->parse->windowClause or use
heuristics and risk reallocating when growing, neither of which is terribly
appealing. Do you have any suggestions or preferences?
> * Reversing the sorted list looks more confusing to me than just sorting it
> in the proper order right away. A qsort() comparator returning negative means
> "left goes before right", but here it is effectively the other way around.
Changed.
> * There is a function named make_pathkeys_for_window that makes a list of
> canonical pathkeys given a window clause. Using this function to give you the
> pathkeys, and then comparing them, would be more future-proof in case we ever
> start using hashing for windowing. Moreover, the canonical pathkeys can be
> compared with pointer comparison which is much faster than equal(). Still,
> I'm not sure whether it's going to be convenient to use in this case, or even
> whether it is a right thing to do. What do you think?
That’s an interesting thought, one that didn’t occur to me while hacking. I’m
not sure whether is would be wise/clean to overload with this functionality
though.
Attached updated version also adds a testcase that was clearly missing from the
previous version and an updated window.out.
cheers ./daniel
window_prefix_sort-v3.patch
Description: Binary data
