Thanks you for your replay.
I realized that i am wrong. I just miss the whole struct swap at the
beginning.
I am so sorry for bothering you with my fault.
2015-03-26 1:38 GMT+08:00 Tom Lane <tgl@sss.pgh.pa.us>:
> Jaimin Pan <jaimin.pan@gmail.com> writes:
> > I think there is a bug in rel cache rebuild of release 9.4.1.
> > it also exists on some other release.
>
> > the issue was introduced by 491dd4a97daa6b4de9ee8401ada10ad5da76af46
>
> > -- a/src/backend/utils/cache/relcache.c
> > +++ b/src/backend/utils/cache/relcache.c
> > @@ -2166,9 +2166,9 @@ RelationClearRelation(Relation relation, bool
> rebuild)
> > /* ... but actually, we don't have to update
> newrel->rd_rel
> > */
> > memcpy(relation->rd_rel, newrel->rd_rel,
> CLASS_TUPLE_SIZE);
> > /* preserve old tupledesc and rules if no logical change
> */
> > - if (keep_tupdesc)
> > + if (!keep_tupdesc)
> > SWAPFIELD(TupleDesc, rd_att);
> > - if (keep_rules)
> > + if (!keep_rules)
> > {
> > SWAPFIELD(RuleLock *, rd_rules);
> > SWAPFIELD(MemoryContext, rd_rulescxt);
>
>
> You would need to provide a fairly convincing argument why you think that
> five-year-old code is backwards. Asserting there's a problem with
> absolutely zero evidence is not likely to impress anyone.
>
> (For the record, it did and does still look right to me. As per the
> comment about thirty lines up, what we're doing is un-swapping the
> fields we don't want to change. If keep_tupdesc is true, we don't
> want to change rd_att, so we need to swap its old value back.
> Likewise for the other thing.)
>
> regards, tom lane
>