Issue in _bt_getrootheight
От | Ahmed Ibrahim |
---|---|
Тема | Issue in _bt_getrootheight |
Дата | |
Msg-id | CAHiW8txjW0qHjeTEwNLGKuLgOPkNXF2TE-sozjSMeeD7uTm77A@mail.gmail.com обсуждение исходный текст |
Ответы |
Re: Issue in _bt_getrootheight
|
Список | pgsql-hackers |
Hi everyone,
We have been working on the pg_adviser extension whose goal is to suggest indexes by creating virtual/hypothetical indexes and see how it affects the query cost.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 :)
В списке pgsql-hackers по дате отправления: