From 1cd93bc54d6e332eb0c9a3dba40bb7d07b91e632 Mon Sep 17 00:00:00 2001 From: Andrey Borodin Date: Fri, 2 Mar 2018 10:21:41 +0500 Subject: [PATCH] Fix GiST stats for partial indexes v3 --- src/backend/access/gist/gistvacuum.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c index 22181c6299..b776c8ea73 100644 --- a/src/backend/access/gist/gistvacuum.c +++ b/src/backend/access/gist/gistvacuum.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/gist_private.h" +#include "access/htup_details.h" #include "commands/vacuum.h" #include "miscadmin.h" #include "storage/indexfsm.h" @@ -33,6 +34,7 @@ gistvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats) blkno; BlockNumber totFreePages; bool needLock; + uint64 tuplesCount = 0; /* No-op in ANALYZE ONLY mode */ if (info->analyze_only) @@ -42,14 +44,6 @@ gistvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats) if (stats == NULL) { stats = (IndexBulkDeleteResult *) palloc0(sizeof(IndexBulkDeleteResult)); - /* use heap's tuple count */ - stats->num_index_tuples = info->num_heap_tuples; - stats->estimated_count = info->estimated_count; - - /* - * XXX the above is wrong if index is partial. Would it be OK to just - * return NULL, or is there work we must do below? - */ } /* @@ -82,12 +76,24 @@ gistvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats) totFreePages++; RecordFreeIndexPage(rel, blkno); } + else + { + /* Count tuples in leaf pages if needed */ + if (GistPageIsLeaf(page)) + { + tuplesCount += PageGetMaxOffsetNumber(page); + } + } UnlockReleaseBuffer(buffer); } /* Finally, vacuum the FSM */ IndexFreeSpaceMapVacuum(info->index); + /* Update index tuples stat to counted over leaf pages if needed */ + stats->num_index_tuples = tuplesCount; + stats->estimated_count = false; + /* return statistics */ stats->pages_free = totFreePages; if (needLock) -- 2.14.3 (Apple Git-98)