Re: WIP: Covering + unique indexes.

Alexander Korotkov <a.korotkov@postgrespro.ru>

From: Alexander Korotkov <a.korotkov@postgrespro.ru>
To: Peter Geoghegan <pg@bowt.ie>
Cc: Teodor Sigaev <teodor@sigaev.ru>, Anastasia Lubennikova <a.lubennikova@postgrespro.ru>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>, Alexander Kuzmenkov <a.kuzmenkov@postgrespro.ru>
Date: 2018-04-06T17:33:56Z
Lists: pgsql-hackers
On Fri, Apr 6, 2018 at 8:22 PM, Peter Geoghegan <pg@bowt.ie> wrote:

> On Fri, Apr 6, 2018 at 10:20 AM, Teodor Sigaev <teodor@sigaev.ru> wrote:
> > As far I can see, there is no any on-disk representation differece for
> > *existing* indexes. So, pg_upgrade is not need here and there isn't any
> new
> > code to support "on-fly" modification. Am I right?
>
> Yes.
>
> I'm going to look at this again today, and will post something within
> 12 hours. Please hold off on committing until then.
>

Thank you.

Thinking about that again, I found that we should relax our requirements to
"minus infinity" items, because pg_upgraded indexes doesn't have any
special bits set for those items.

What do you think about applying following patch on the top of v14?

diff --git a/src/backend/access/nbtree/nbtsearch.c
b/src/backend/access/nbtree/nbtsearch.c
index 44605fb5a4..53dc47ff82 100644
--- a/src/backend/access/nbtree/nbtsearch.c
+++ b/src/backend/access/nbtree/nbtsearch.c
@@ -2000,8 +2000,12 @@ _bt_check_natts(Relation index, Page page,
OffsetNumber offnum)
    }
    else if (!P_ISLEAF(opaque) && offnum == P_FIRSTDATAKEY(opaque))
    {
-       /* Leftmost tuples on non-leaf pages have no attributes */
-       return (BTreeTupGetNAtts(itup, index) == 0);
+       /*
+        * Leftmost tuples on non-leaf pages have no attributes, or haven't
+        * INDEX_ALT_TID_MASK set in pg_upgraded indexes.
+        */
+       return (BTreeTupGetNAtts(itup, index) == 0 ||
+               ((itup->t_info & INDEX_ALT_TID_MASK) == 0));
    }
    else
    {

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

Commits

  1. Adjust INCLUDE index truncation comments and code.

  2. Add commentary explaining why MaxIndexTuplesPerPage calculation is safe.

  3. Indexes with INCLUDE columns and their support in B-tree

  4. Add amcheck verification of heap relations belonging to btree indexes.

  5. Doc: move info for btree opclass implementors into main documentation.

  6. Doc: mention that you can't PREPARE TRANSACTION after NOTIFY.

  7. Remove dedicated B-tree root-split record types.

  8. Restructure index access method API to hide most of it at the C level.

  9. Split _bt_insertonpg to two functions.

  10. Major overhaul of btree index code. Eliminate special BTP_CHAIN logic for