mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Support for INCLUDE attributes in GiST indexes
Similarly to B-tree, GiST index access method gets support of INCLUDE attributes. These attributes aren't used for tree navigation and aren't present in non-leaf pages. But they are present in leaf pages and can be fetched during index-only scan. The point of having INCLUDE attributes in GiST indexes is slightly different from the point of having them in B-tree. The main point of INCLUDE attributes in B-tree is to define UNIQUE constraint over part of attributes enabled for index-only scan. In GiST the main point of INCLUDE attributes is to use index-only scan for attributes, whose data types don't have GiST opclasses. Discussion: https://postgr.es/m/73A1A452-AD5F-40D4-BD61-978622FF75C1%40yandex-team.ru Author: Andrey Borodin, with small changes by me Reviewed-by: Andreas Karlsson
This commit is contained in:
@ -158,6 +158,7 @@ gistrescan(IndexScanDesc scan, ScanKey key, int nkeys,
|
||||
if (scan->xs_want_itup && !scan->xs_hitupdesc)
|
||||
{
|
||||
int natts;
|
||||
int nkeyatts;
|
||||
int attno;
|
||||
|
||||
/*
|
||||
@ -167,13 +168,23 @@ gistrescan(IndexScanDesc scan, ScanKey key, int nkeys,
|
||||
* types.
|
||||
*/
|
||||
natts = RelationGetNumberOfAttributes(scan->indexRelation);
|
||||
nkeyatts = IndexRelationGetNumberOfKeyAttributes(scan->indexRelation);
|
||||
so->giststate->fetchTupdesc = CreateTemplateTupleDesc(natts);
|
||||
for (attno = 1; attno <= natts; attno++)
|
||||
for (attno = 1; attno <= nkeyatts; attno++)
|
||||
{
|
||||
TupleDescInitEntry(so->giststate->fetchTupdesc, attno, NULL,
|
||||
scan->indexRelation->rd_opcintype[attno - 1],
|
||||
-1, 0);
|
||||
}
|
||||
|
||||
for (; attno <= natts; attno++)
|
||||
{
|
||||
/* taking opcintype from giststate->tupdesc */
|
||||
TupleDescInitEntry(so->giststate->fetchTupdesc, attno, NULL,
|
||||
TupleDescAttr(so->giststate->leafTupdesc,
|
||||
attno - 1)->atttypid,
|
||||
-1, 0);
|
||||
}
|
||||
scan->xs_hitupdesc = so->giststate->fetchTupdesc;
|
||||
|
||||
/* Also create a memory context that will hold the returned tuples */
|
||||
|
Reference in New Issue
Block a user