Re: relcache sometimes initially ignores has_generated_stored

From: Kyotaro Horiguchi <horikyota(dot)ntt(at)gmail(dot)com>
To: andres(at)anarazel(dot)de
Cc: pgsql-hackers(at)postgresql(dot)org, peter_e(at)gmx(dot)net
Subject: Re: relcache sometimes initially ignores has_generated_stored
Date: 2020-01-16 06:10:36
Message-ID: 20200116.151036.430834561491240132.horikyota.ntt@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

At Wed, 15 Jan 2020 10:11:05 -0800, Andres Freund <andres(at)anarazel(dot)de> wrote in
> Hi,
>
> I think it's probably not relevant, but it confused me for a moment
> that RelationBuildTupleDesc() might set constr->has_generated_stored to
> true, but then throw away the constraint at the end, because nothing
> matches the
> /*
> * Set up constraint/default info
> */
> if (has_not_null || ndef > 0 ||
> attrmiss || relation->rd_rel->relchecks)
> test, i.e. there are no defaults.

It was as follows before 16828d5c02.

- if (constr->has_not_null || ndef > 0 ||relation->rd_rel->relchecks)

At that time TupleConstr has only members defval, check and
has_not_null other than subsidiary members. The condition apparently
checked all of the members.

Then the commit adds attrmiss to the condition since the corresponding
member to TupleConstr.

+ if (constr->has_not_null || ndef > 0 ||
+ attrmiss || relation->rd_rel->relchecks)

Later fc22b6623b introduced has_generated_stored to TupleConstr but
didn't add the corresponding check.

> A quick assert confirms we do indeed pfree() constr in cases where
> has_generated_stored == true.
>
> I suspect that's just an intermediate catalog, however, e.g. when
> DefineRelation() does
> heap_create_with_catalog();
> CommandCounterIncrement();
> relation_open();
> AddRelationNewConstraints().
>
> It does still strike me as not great that we can get a different
> relcache entry, even if transient, depending on whether there are other
> reasons to create a TupleConstr. Say a NOT NULL column.
>
> I'm inclined to think we should just also check has_generated_stored in
> the if quoted above?

I agree to that. We could have a local boolean "has_any_constraint"
to merge them but it would be an overkill.

regards.

--
Kyotaro Horiguchi
NTT Open Source Software Center

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Andres Freund 2020-01-16 06:17:32 Re: SlabCheck leaks memory into TopMemoryContext
Previous Message Michael Paquier 2020-01-16 05:50:01 Re: remove some STATUS_* symbols