Re: FETCH FIRST clause WITH TIES option - Mailing list pgsql-hackers
From | Tomas Vondra |
---|---|
Subject | Re: FETCH FIRST clause WITH TIES option |
Date | |
Msg-id | 40c9e6c5-4fc7-1589-0cc5-8a857405b91a@2ndquadrant.com Whole thread Raw |
In response to | FETCH FIRST clause WITH TIES option (Surafel Temesgen <surafel3000@gmail.com>) |
Responses |
Re: FETCH FIRST clause WITH TIES option
Re: FETCH FIRST clause WITH TIES option |
List | pgsql-hackers |
Hello Surafel, On 10/26/2018 12:28 PM, Surafel Temesgen wrote: > hello , > > The WITH TIES keyword is sql standard that specifies any peers of > retained rows to retained in the result set too .which means > according to ordering key the result set can includes additional rows > which have ties on the last position, if there are any and It work > with ORDER BY query. > Thanks for the patch. I've looked at it today, and it seems mostly OK, with a couple of minor issues. Most of it is code formatting and comment wording issues, so I'm not going to go through them here - see the attached 0002 patch (0001 is your patch, rebased to current master). There's one place that I think is incorrect, and that's this bit from ExecLimit: }else /* * Get next tuple from subplan, if any. */ slot = ExecProcNode(outerPlan); if (TupIsNull(slot)) { node->lstate = LIMIT_SUBPLANEOF; return NULL; } if (node->limitOption == WITH_TIES) { ExecCopySlot(node->last_slot, slot); } node->subSlot = slot; node->position++; Note that the "else" guards only the very first line, not the whole block. This seems wrong, i.e. there should be {} around the whole block. I'm also suggesting to slightly change the create_limit_plan(), to keep a single make_limit call. IMHO that makes it easier to understand, although I admit it's fairly subjective. One question is whether to make this work for LIMIT too, not just for FETCH FIRST. I'm not sure how difficult would that be (it should be a grammar-only tweak I guess), or if it's a good idea in general. But I find it quite confusing that various comments say things like this: LimitOption limitOption; /* LIMIT with ties or exact number */ while in fact it does not work with LIMIT. > > The attach patch is a finished implementation of it except it did not > have a regression test because am not sure of changing the test data set > for it and I can’t find fetch first clause regression test too. > Well, that's not a very good reason not to have tests for this new improvement. FWIW there are a couple of places in regression tests where FETCH FIRST is used, see this: $ grep -i 'fetch first' src/test/regress/sql/* src/test/regress/sql/hs_standby_allowed.sql:fetch first from hsc; src/test/regress/sql/tablesample.sql:FETCH FIRST FROM tablesample_cur; src/test/regress/sql/tablesample.sql:FETCH FIRST FROM tablesample_cur; src/test/regress/sql/tidscan.sql:FETCH FIRST FROM c; But those places don't seem like very good match for testing the new stuff, because those are primarily testing something else. I suggest we add the new tests into limit.sql. regards -- Tomas Vondra http://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachment
pgsql-hackers by date: