Re: Some RELKIND macro refactoring

From: Peter Eisentraut <peter(dot)eisentraut(at)enterprisedb(dot)com>
To: Michael Paquier <michael(at)paquier(dot)xyz>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Some RELKIND macro refactoring
Date: 2021-11-22 10:21:52
Message-ID: d0ce69e6-d8c9-af2b-a986-d2938a312862@enterprisedb.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 19.11.21 08:31, Michael Paquier wrote:
> On Mon, Nov 01, 2021 at 07:28:16AM +0100, Peter Eisentraut wrote:
>>
>> Small rebase of this patch set.
>
> Regarding 0001, I find the existing code a bit more self-documenting
> if we keep those checks flagInhAttrs() and guessConstraintInheritance().
> So I would rather leave these.

In that case, the existing check in guessConstraintInheritance() seems
wrong, because it doesn't check for RELKIND_MATVIEW. Should we fix
that? It's dead code either way, but if the code isn't exercises, then
these kinds of inconsistency come about.

> I like 0002, which makes things a bit easier to go through across
> various places where relkind-only checks are replaced by those new
> macros. There is one thing I bumped into, though..
>
>> if (create_storage)
>> {
>> - switch (rel->rd_rel->relkind)
>> - {
>> - case RELKIND_VIEW:
>> - case RELKIND_COMPOSITE_TYPE:
>> - case RELKIND_FOREIGN_TABLE:
>> - case RELKIND_PARTITIONED_TABLE:
>> - case RELKIND_PARTITIONED_INDEX:
>> - Assert(false);
>> - break;
>> - [ .. deletions .. ]
>> - }
>> + if (RELKIND_HAS_TABLE_AM(rel->rd_rel->relkind))
>> + table_relation_set_new_filenode(rel, &rel->rd_node,
>> + relpersistence,
>> + relfrozenxid, relminmxid);
>> + else
>> + RelationCreateStorage(rel->rd_node, relpersistence);
>> }
>
> I think that you should keep this block as it is now. The part where
> a relkind does not support table AMs and does not require storage
> would get uncovered, and this new code would just attempt to create
> storage, so it seems to me that the existing code is better when it
> comes to prevent mistakes from developers? You could as well use an
> else if (RELKIND_INDEX || RELKIND_SEQUENCE) for
> RelationCreateStorage(), and fall back to Assert(false) in the else
> branch, to get the same result as the original without impacting the
> level of safety of the original code.

Maybe

else
{
Assert(RELKIND_HAS_STORAGE(rel->rd_rel->relkind);
RelationCreateStorage(rel->rd_node, relpersistence);
}

create_storage is set earlier based on RELKIND_HAS_STORAGE(), so this
would be consistent.

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Daniel Gustafsson 2021-11-22 10:22:05 Re: Feature Proposal: Connection Pool Optimization - Change the Connection User
Previous Message Gurjeet Singh 2021-11-22 09:50:07 Begin a transaction on a SAVEPOINT that is outside any transaction