On Mon, Apr 16, 2018 at 1:05 AM, Peter Geoghegan <p...@bowt.ie> wrote:

> Attached patch makes the changes that I talked about, and a few
> others. The commit message has full details. The general direction of
> the patch is that it documents our assumptions, and verifies them in
> more cases. Most of the changes I've made are clear improvements,
> though in a few cases I've made changes that are perhaps more
> debatable.


Great, thank you very much!


> These other, more debatable cases are:
>
> * The comments added to _bt_isequal() about suffix truncation may not
> be to your taste. The same is true of the way that I restored the
> previous _bt_isequal() function signature. (Yes, I want to change it
> back despite the fact that I was the person that originally suggested
> we change _bt_isequal().)
>

Hmm, what do you think about making BTreeTupGetNAtts() take tupledesc
argument, not relation>  It anyway doesn't need number of key attributes,
only total number of attributes.  Then _bt_isequal() would be able to use
BTreeTupGetNAtts().

* I added BTreeTupSetNAtts() calls to a few places that don't truly
> need them, such as the point where we generate a dummy 0-attribute
> high key within _bt_mark_page_halfdead(). I think that we should try
> to be as consistent as possible about using BTreeTupSetNAtts(), to set
> a good example. I don't think it's necessary to use BTreeTupSetNAtts()
> for pivot tuples when the number of key attributes matches indnatts
> (it seems inconvenient to have to palloc() our own scratch buffer to
> do this when we don't have to), but that doesn't apply to these
> now-covered cases.
>

+1

>
> > I think, we need move _bt_check_natts() and its call under
> > USE_ASSERT_CHECKING to prevent performance degradation. Users shouldn't
> pay
> > for unused feature.
>
> I eventually decided that you were right about this, and made the
> _bt_compare() call to _bt_check_natts() a simple assertion without
> waiting to hear more opinions on the matter. Concurrency isn't a
> factor here, so adding a check to standard release builds isn't
> particularly likely to detect bugs. Besides, there is really only a
> small number of places that need to do truncation for themselves. And,
> if you want to be sure that the structure is consistent in the field,
> there is always amcheck, which can check _bt_check_natts() (while also
> checking other things that we care about just as much).
>

Good point, risk of performance degradation caused by _bt_check_natts()
in _bt_compare() is high.  So, let's move in to assertion.

Note that I removed some dead code from _bt_insertonpg() that wasn't
> added by the INCLUDE patch. It confused matters for this patch, since
> we don't want to consider what's supposed to happen when there is a
> retail insertion of a new, second negative infinity item -- clearly,
> that should simply never happen (I thought about adding a
> BTreeTupSetNAtts() call, but then decided to just remove the dead code
> and add a new "can't happen" elog error).


I think it's completely OK to fix broken things when you've to touch
them.  Probably, Teodor would decide to make that by separate commit.
So, it's up to him.


> Finally, I made sure that we
> don't drop all tables in the regression tests, so that we have some
> pg_dump coverage for INCLUDE indexes, per a request from Tom.
>

Makes sense, because that've already appeared to be broken.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Reply via email to