Re: [SQL] Cursors and backwards scans and SCROLL

From: Josh Berkus <josh(at)agliodbs(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-hackers(at)postgreSQL(dot)org, pgsql-sql(at)postgreSQL(dot)org
Subject: Re: [SQL] Cursors and backwards scans and SCROLL
Date: 2003-03-09 20:59:35
Message-ID: 200303091259.35423.josh@agliodbs.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-sql

Tom,

> Postgres' implementation of cursors has always had a problem with doing
> MOVE or FETCH backwards on complex queries.

Coincidnetally enough, I was just chatting with one of my contractors
yesterday about how the one thing that Transact-SQL has to offer is a really
good cursor implementation. It would be lovely to improve ours to match.

> Fixing this directly seems unreasonably difficult, so I'm currently
> working on fixing it by inserting a Materialize plan node at the top of
> the plan tree for a cursor, if the plan tree couldn't otherwise support
> backwards scan. The Materialize node will save aside a copy of each row
> as it's fetched from the underlying plan, and use this copied table if
> any backwards scanning is asked for.

Sounds good to me. It's also very similar to what T-SQL does for a STATIC or
KEYSET cursor, and works very well in their implementation. (FWIW, T-SQL's
cursor types, such as DYNAMIC and KEYSET, are unnecessary for Postgres due to
MVCC)

> 2. Error out only if a backwards fetch is actually attempted on a plan
> tree that can't handle it (which could only happen if SCROLL wasn't
<snip>
> I'm presently leaning to #2, even though it exposes implementation
> details. I'm open to discussion though. Any preferences? Other ideas?

This sounds like a good idea to me in a staggered-implementation sense if it's
doable. That is, we'd implement the behavior in #2 in the next version of
Postgresql, and the behavior in #1 or in #3 in the version after that. If,
however, the implementation of #2 is too difficult, then I think #3 would be
a good choice.

From my perspective, the "SCROLL" declaration has *always* been the SQL-spec,
and it is the behaviour used by other databases, even if it's been superflous
in PostgreSQL until now. So from that point of view, developers who have
been not using "SCROLL" have been sloppy and can reasonably expect to have to
audit their code in future versions of PostgreSQL.

On the other hand, I don't use cursors much in Postgres, so I'm kind of a
priest doing marriage counselling as far as that's concerned. PL/pgSQL's
"FOR record IN query" is currently both easier and faster than cursors so I
use that 90% of the time.

--
Josh Berkus
Aglio Database Solutions
San Francisco

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Rod Taylor 2003-03-09 21:04:28 Re: Cursors and backwards scans and SCROLL
Previous Message Tom Lane 2003-03-09 20:55:45 Re: SQL99 ARRAY support proposal

Browse pgsql-sql by date

  From Date Subject
Next Message Rod Taylor 2003-03-09 21:04:28 Re: Cursors and backwards scans and SCROLL
Previous Message Tom Lane 2003-03-09 20:35:11 Cursors and backwards scans and SCROLL