Prev: FM format modifier does not remove leading zero from year
Next: Backup history file should be replicated in Streaming Replication?
From: Marko Tiikkaja on 8 Feb 2010 14:30 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 -- Sent via pgsql-hackers mailing list (pgsql-hackers(a)postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers |