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