FETCH ALL positions cursor strangely?

Поиск
Список
Период
Сортировка
От Bill Gribble
Тема FETCH ALL positions cursor strangely?
Дата
Msg-id 1052407923.1322.1.camel@oc-demo.internal.billgribble.com
обсуждение исходный текст
Ответы Re: FETCH ALL positions cursor strangely?  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-general
I'm using cursors a fair amount in an app I'm doing now and one bit of
PostgreSQL behavior has puzzled me for a while.

"FETCH n FROM cursor" returns n rows and positions the cursor n rows
ahead of its current position. That makes sense to me.  However, if
there are n rows in the query, "FETCH ALL FROM cursor" will return n
rows, but seemingly positions the cursor n+1 rows ahead of its current
position, as demonstrated in the following transcript.

This doesn't seem to be documented in the MOVE or FETCH references; is
it intentional?  If so, what's the rationale?  It's easy enough to work
around, but it seems like a bug to me.

Thanks,
Bill Gribble

Welcome to psql 7.3.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

equitest=# select version();
                                version
------------------------------------------------------------------------
 PostgreSQL 7.3.2 on i386-pc-linux-gnu, compiled by GCC gcc (GCC) 3.2.3
(1 row)

equitest=# create table t(foo int4);
CREATE TABLE
equitest=# insert into t values (1);
INSERT 23482866 1
equitest=# insert into t values (2);
INSERT 23482867 1
equitest=# select * from t
equitest-#
equitest=# select * from t ;
 foo
-----
   1
   2
(2 rows)

equitest=# begin ;
BEGIN
equitest=# declare c cursor for select * from t;
DECLARE CURSOR
equitest=# fetch 2 from c;
 foo
-----
   1
   2
(2 rows)

equitest=# move backward 2 in c;
MOVE 1
equitest=# fetch 2 from c;
 foo
-----
   1
   2
(2 rows)

equitest=# move backward 2 in c;
MOVE 1
equitest=# fetch all from c;
 foo
-----
   1
   2
(2 rows)

equitest=# move backward 2 in c;
MOVE 2
equitest=# fetch all from c;
 foo
-----
   2
(1 row)

equitest=# move backward 3 in c;
MOVE 2
equitest=# fetch all from c;
 foo
-----
   1
   2
(2 rows)


В списке pgsql-general по дате отправления:

Предыдущее
От: Stephan Szabo
Дата:
Сообщение: Re: indices - used by which user ?
Следующее
От: "scott.marlowe"
Дата:
Сообщение: Re: Creating functions and triggers