1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-04 20:11:56 +03:00

Check that index can return in get_actual_variable_range()

Some recent changes were made to remove the explicit dependency on
btree indexes in some parts of the code.  One of these changes was
made in commit 9ef1851685, which allows non-btree indexes to be used
in get_actual_variable_range().  A follow-up commit ee1ae8b99f fixes
the cases where an index doesn’t have a sortopfamily as this is a
prerequisite to be used in get_actual_variable_range().

However, it was found that indexes that have amcanorder = true but do
not allow index-only-scans (amcanreturn returns false or is NULL) will
pass all of the conditions, while they should be rejected since
get_actual_variable_range() uses the index-only-scan machinery in
get_actual_variable_endpoint().  Such an index might cause errors like

    ERROR:  no data returned for index-only scan

during query planning.

The fix is to add a check in get_actual_variable_range() to reject
indexes that do not allow index-only scans.

Author: Maxime Schoemans <maxime.schoemans@enterprisedb.com>
Discussion: https://www.postgresql.org/message-id/flat/20ED852A-C2D9-41EB-8671-8C8B9D418BE9%40enterprisedb.com
This commit is contained in:
Peter Eisentraut
2025-10-28 10:06:03 +01:00
parent b45a8d7d8b
commit 74197bdc84

View File

@@ -6554,6 +6554,13 @@ get_actual_variable_range(PlannerInfo *root, VariableStatData *vardata,
if (index->hypothetical) if (index->hypothetical)
continue; continue;
/*
* get_actual_variable_endpoint uses the index-only-scan machinery, so
* ignore indexes that can't use it on their first column.
*/
if (!index->canreturn[0])
continue;
/* /*
* The first index column must match the desired variable, sortop, and * The first index column must match the desired variable, sortop, and
* collation --- but we can use a descending-order index. * collation --- but we can use a descending-order index.