On Monday, May 30, 2011 11:18:20 PM Alvaro Herrera wrote:
> Excerpts from Greg Sabino Mullane's message of lun may 30 12:00:43 -0400 
2011:
> > Wow, this one took a bit to narrow down. Here's the failing case:
> > 
> > # create unlogged table foo (a text);
> > CREATE TABLE
> > # begin;
> > BEGIN
> > #* truncate table foo;
> > TRUNCATE TABLE
> > #* truncate table foo;
> > ERROR:  could not create file "base/19131/19183_init": File exists
> > 
> > Very reproducible. The column types matter: if the only column
> > is an INT, for example, the problem does not occur.
> 
> So 19183 is the toast table OID?
Nope. Its any index.

You can provoke it with:
begin;create unlogged table foo (a int primary key);truncate foo;rollback;
or
begin;create unlogged table foo (a text);truncate foo;rollback;


The problem is this tidbit from tablecmds.c's ExecuteTruncate:

                /*
                 * Normally, we need a transaction-safe truncation here.  
However, if
                 * the table was either created in the current (sub)transaction 
or has
                 * a new relfilenode in the current (sub)transaction, then we 
can just
                 * truncate it in-place, because a rollback would cause the 
whole
                 * table or the current physical file to be thrown away anyway.
                 */
                if (rel->rd_createSubid == mySubid ||
                        rel->rd_newRelfilenodeSubid == mySubid)
                {
                        /* Immediate, non-rollbackable truncation is OK */
                        heap_truncate_one_rel(rel);
                }

in combination with index.c's index_build:


        /*
         * If this is an unlogged index, we need to write out an init fork for 
it.
         */
        if (heapRelation->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED)
        {
                RegProcedure ambuildempty = indexRelation->rd_am->ambuildempty;

                RelationOpenSmgr(indexRelation);
                smgrcreate(indexRelation->rd_smgr, INIT_FORKNUM, false);
                OidFunctionCall1(ambuildempty, PointerGetDatum(indexRelation));
        }

Andres

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to