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 commit9ef1851685, which allows non-btree indexes to be used in get_actual_variable_range(). A follow-up commitee1ae8b99ffixes 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:
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user