Re: Getting ERROR: could not open file "base/13164/t3_16388" withpartition table with ON COMMIT - Mailing list pgsql-hackers

From Amit Langote
Subject Re: Getting ERROR: could not open file "base/13164/t3_16388" withpartition table with ON COMMIT
Date
Msg-id e1b7c3ec-dbfc-4295-8bec-ee985114ecb5@lab.ntt.co.jp
Whole thread Raw
In response to Re: Getting ERROR: could not open file "base/13164/t3_16388" with partition table with ON COMMIT  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Getting ERROR: could not open file "base/13164/t3_16388" with partition table with ON COMMIT  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
On 2018/09/13 1:14, Tom Lane wrote:
> Amit Langote <Langote_Amit_f8@lab.ntt.co.jp> writes:
>> The infamous missing-relkind-check in heap_truncate() seems to be behind
>> this.  Perhaps, a patch like the attached will do?
> 
> That seems excessively restrictive.  Anything that has storage (e.g.
> matviews) ought to be truncatable, no?

Not by heap_truncate it seems.  The header comment of heap_truncate says
that it concerns itself only with ON COMMIT truncation of temporary tables:

/*
 *   heap_truncate
 *
 *   This routine deletes all data within all the specified relations.
 *
 * This is not transaction-safe!  There is another, transaction-safe
 * implementation in commands/tablecmds.c.  We now use this only for
 * ON COMMIT truncation of temporary tables, where it doesn't matter.
 */

ON COMMIT clause can only be used with temporary tables, so the only two
possible relkind values that can be encountered here are RELKIND_RELATION
and RELKIND_PARTITIONED_TABLE.  Of the two, only the RELKIND_RELATION can
have storage.

> I thought we had a macro or utility function somewhere that knew which
> relkinds have storage, though I can't find it right now.  I'd be
> inclined to instantiate that if it doesn't exist, and then the code
> here ought to read something like
> 
>     if (RelkindHasStorage(rel->rd_rel->relkind))
>         heap_truncate_one_rel(rel);

There have been discussions (such as [1]), but none that led to some patch
being committed.  Might be a good idea to revive that discussion again, or
perhaps there is already some solution being discussed on the pluggable
storage thread.

> Also, possibly the test ought to be inside heap_truncate_one_rel
> rather than its callers?

Hmm, perhaps.  ExecuteTruncateGuts, the only other caller of
heap_truncate_one_rel, also checks the relkind to skip partitioned tables.
 There seem to be reasons to do it in the caller in that case though,
other than heap_truncate_one_rel being incapable of handling them.

Thanks,
Amit


[1] Macros bundling RELKIND_* conditions
https://www.postgresql.org/message-id/CAFjFpRcfzs%2Byst6YBCseD_orEcDNuAr9GUTraZ5GC%3DAvCYh55Q%40mail.gmail.com



pgsql-hackers by date:

Previous
From: Michael Paquier
Date:
Subject: Re: stat() on Windows might cause error if target file is largerthan 4GB
Next
From: Amit Langote
Date:
Subject: Re: Getting ERROR: could not open file "base/13164/t3_16388" withpartition table with ON COMMIT