On Wed, May 16, 2018 at 1:41 AM, Tom Lane <t...@sss.pgh.pa.us> wrote:

> Nikita Glukhov <n.glu...@postgrespro.ru> writes:
> > Experimenting with the new pluggable storage API, I found that
> amcanbackward
> > flag is not checked in build_index_paths() before
> > build_index_pathkeys(... BackwardScanDirection) call when we are building
> > paths for ORDER BY.  And this flag is even not copied into IndexOptInfo
> struct.
> > Obviously, this can lead to misuse of Backward Index [Only] Scan plans.
>
> > Attached patch with the corresponding fix.
>
> I think this patch is based on a misunderstanding of what amcanbackward
> means.  We *require* indexes that claim to support amcanorder to support
> scanning in either direction.  What amcanbackward is about is whether
> the index can support reversing direction mid-scan, as would be required
> to support FETCH FORWARD followed by FETCH BACKWARD in a cursor.  That's
> actually independent of whether the index can implement a defined
> ordering; see for example the hash AM, which sets amcanbackward but not
> amcanorder.
>
> This is documented, though perhaps not sufficiently clearly, in
> indexam.sgml:
>
>     The amgettuple function has a direction argument, which can be either
>     ForwardScanDirection (the normal case) or BackwardScanDirection. If
>     the first call after amrescan specifies BackwardScanDirection, then
>     the set of matching index entries is to be scanned back-to-front
>     rather than in the normal front-to-back direction, so amgettuple must
>     return the last matching tuple in the index, rather than the first one
>     as it normally would. (This will only occur for access methods that
>     set amcanorder to true.) After the first call, amgettuple must be
>     prepared to advance the scan in either direction from the most
>     recently returned entry. (But if amcanbackward is false, all
>     subsequent calls will have the same direction as the first one.)
>

Thank you for clarifying this point.  We've missed that.

Perhaps there is a case for adding an additional flag to allow specifying
> "I can't support ORDER BY DESC", but I'm not in a big hurry to do so.
> I think there would be more changes than this needed to handle such a
> restriction, anyway.
>

OK, got it.  We'll probably propose a patch implementing that to the
next commitfest.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Reply via email to