postgres.git / summary / log / commit / refs

commit    74197bdc842a280befe834e5cb4be700af9f8198
Author:   Peter Eisentraut <peter@eisentraut.org>
Date:     Tue Oct 28 09:06:03 2025 +0000
First released in: 18.1

    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 9ef1851685b, which allows non-btree indexes to be used
    in get_actual_variable_range().  A follow-up commit ee1ae8b99f9 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


src/backend/utils/adt/selfuncs.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 65ae682e298..c82bacd7c15 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -6554,6 +6554,13 @@ get_actual_variable_range(PlannerInfo *root, VariableStatData *vardata, if (index->hypothetical) 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 * collation --- but we can use a descending-order index. [parent: b45a8d7d8b30]