Writeable CTEs and empty relations
От | Marko Tiikkaja |
---|---|
Тема | Writeable CTEs and empty relations |
Дата | |
Msg-id | 4B70663B.1020409@cs.helsinki.fi обсуждение исходный текст |
Ответы |
Re: Writeable CTEs and empty relations
Re: Writeable CTEs and empty relations |
Список | pgsql-hackers |
Hi, While playing around with another issue with the patch, I came across the following: => create table foo(a int); CREATE TABLE => with t as (insert into foo values(0)) select * from foo;a --- (0 rows) I traced this down to heapam.c, which has this: /** return null immediately if relation is empty*/if (scan->rs_nblocks == 0){ Assert(!BufferIsValid(scan->rs_cbuf)); tuple->t_data = NULL; return;} and /* * Determine the number of blocks we have to scan. * * It is sufficient to do this once at scan start, since any tuples added * while the scan is in progress will be invisible to my snapshot anyway. * (That is not true when using a non-MVCC snapshot. However, we couldn't * guarantee to return tuples added after scan start anyway, since they * might go into pages we already scanned. To guarantee consistent * results for a non-MVCC snapshot, the caller must hold some higher-level * lock that ensures the interesting tuple(s) won't change.) */ scan->rs_nblocks = RelationGetNumberOfBlocks(scan->rs_rd); This doesn't exactly work anymore since we modify the snapshot after calling ExecInitScan(). I'm not really familiar with this part of the code, so I'm asking: is there a simple enough way around this? Would updating scan->rs_nblocks before scanning the first tuple be OK? Regards, Marko Tiikkaja
В списке pgsql-hackers по дате отправления: