From: | Ahmed Ibrahim <ahmed(dot)ibr(dot)hashim(at)gmail(dot)com> |
---|---|
To: | pgsql-hackers(at)lists(dot)postgresql(dot)org |
Cc: | Gurjeet Singh <gurjeet(at)singh(dot)im> |
Subject: | Issue in _bt_getrootheight |
Date: | 2023-07-11 16:35:14 |
Message-ID: | CAHiW8txjW0qHjeTEwNLGKuLgOPkNXF2TE-sozjSMeeD7uTm77A@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi everyone,
We have been working on the pg_adviser
<https://github.com/DrPostgres/pg_adviser> extension whose goal is to
suggest indexes by creating virtual/hypothetical indexes and see how it
affects the query cost.
The hypothetical index shouldn't take any space on the disk (allocates 0
pages) so we give it the flag *INDEX_CREATE_SKIP_BUILD.*
But the problem comes from here when the function *get_relation_info *is
called in planning stage, it tries to calculate the B-Tree height by
calling function *_bt_getrootheight*, but the B-Tree is not built at all,
and its metadata page (which is block 0 in our case) doesn't exist, so this
returns error that it cannot read the page (since it doesn't exist).
I tried to debug the code and found that this feature was introduced in
version 9.3 under this commit [1]. I think that in the code we need to
check if it's a B-Tree index *AND *the index is built/have some pages, then
we can go and calculate it otherwise just put it to -1
I mean instead of this
if (info->relam == BTREE_AM_OID)
{
/* For btrees, get tree height while we have the index open */
info->tree_height = _bt_getrootheight(indexRelation);
}
else
{
/* For other index types, just set it to "unknown" for now */
info->tree_height = -1;
}
The first line should be
if (info->relam == BTREE_AM_OID && info->pages > 0)
or use the storage manager (smgr) to know if the first block exists.
I would appreciate it if anyone can agree/approve or deny so that I know if
anything I am missing :)
Thanks everyone :)
[1]
https://github.com/postgres/postgres/commit/31f38f28b00cbe2b9267205359e3cf7bafa1cb97
From | Date | Subject | |
---|---|---|---|
Next Message | Shruthi Gowda | 2023-07-11 17:22:16 | 'ERROR: attempted to update invisible tuple' from 'ALTER INDEX ... ATTACH PARTITION' on parent index |
Previous Message | Nathan Bossart | 2023-07-11 16:32:32 | Re: add non-option reordering to in-tree getopt_long |