CURRENT OF causes an error when IndexOnlyScan is used
От | Yugo Nagata |
---|---|
Тема | CURRENT OF causes an error when IndexOnlyScan is used |
Дата | |
Msg-id | 20180201013349.937dfc5f.nagata@sraoss.co.jp обсуждение исходный текст |
Ответы |
Re: CURRENT OF causes an error when IndexOnlyScan is used
|
Список | pgsql-hackers |
Hi, I found that updating a cursor by using CURRENT OF causes the following error when the query is executed by IndexOnlyScan. ERROR: cannot extract system attribute from virtual tuple IndexOnlyScan returns a virtual tuple that doesn't have system column, so we can not get ctid in the same way of other plans. However, the error message is not convinient and users would not understand why the error occurs. Attached is a patch to fix this. By this fix, execCurrentOf get ctid from IndexScanDesc->xs_ctup.t_self when the plan is IndexOnlyScan, and it works sucessfully without errors. Here is the example of the error: ======= postgres=# create table test (i int primary key); CREATE TABLE postgres=# insert into test values(1); INSERT 0 1 postgres=# set enable_seqscan to off; SET postgres=# explain select * from test where i = 1; QUERY PLAN --------------------------------------------------------------------------- Index Only Scan using test_pkey on test (cost=0.15..8.17 rows=1 width=4) Index Cond: (i = 1) (2 rows) postgres=# begin; BEGIN postgres=# declare c cursor for select * from test where i = 1; DECLARE CURSOR postgres=# fetch from c; i --- 1 (1 row) postgres=# update test set i=i+1 where current of c; ERROR: cannot extract system attribute from virtual tuple ======= The patch fixes the error and allows this update successfully. Regards, -- Yugo Nagata <nagata@sraoss.co.jp>
Вложения
В списке pgsql-hackers по дате отправления: