> On Feb 25, 2026, at 18:13, Kirill Reshke <[email protected]> wrote:
> 
> On Wed, 25 Feb 2026 at 11:59, Chao Li <[email protected]> wrote:
>> 
>> 
>> 
>>> On Feb 25, 2026, at 14:43, Kirill Reshke <[email protected]> wrote:
>>> 
>>> On Wed, 25 Feb 2026 at 08:12, Chao Li <[email protected]> wrote:
>>>> 
>>>> Hi,
>>>> 
>>>> While poking around the code in contrib/amcheck/verify_nbtree.c, I noticed 
>>>> the following block:
>>>> ```
>>>>       if (allequalimage && !_bt_allequalimage(indrel, false))
>>>>       {
>>>>               bool            has_interval_ops = false;
>>>> 
>>>>               for (int i = 0; i < 
>>>> IndexRelationGetNumberOfKeyAttributes(indrel); i++)
>>>>                       if (indrel->rd_opfamily[i] == INTERVAL_BTREE_FAM_OID)
>>>>                       {
>>>>                               has_interval_ops = true;
>>>>                               ereport(ERROR,
>>>>                                               
>>>> (errcode(ERRCODE_INDEX_CORRUPTED),
>>>>                                                errmsg("index \"%s\" 
>>>> metapage incorrectly indicates that deduplication is safe",
>>>>                                                               
>>>> RelationGetRelationName(indrel)),
>>>>                                                has_interval_ops
>>>>                                                ? errhint("This is known of 
>>>> \"interval\" indexes last built on a version predating 2023-11.")
>>>>                                                : 0));
>>>>                       }
>>>>       }
>>>> ```
>>>> 
>>>> My initial impression was that has_interval_ops was unneeded and could be 
>>>> removed, as it is always true at the point of use. I originally thought 
>>>> this would just be a tiny refactoring.
>>>> 
>>>> However, on second thought, I realized that having the ereport inside the 
>>>> for loop is actually a bug. If allequalimage is set in the metapage but 
>>>> _bt_allequalimage says it’s unsafe, we should report corruption regardless 
>>>> of the column types. In the current code, if the index does not contain an 
>>>> interval opfamily, the loop finishes without reaching the ereport, thus 
>>>> silencing the corruption.
>>>> 
>>>> This patch moves the ereport out of the for loop. This ensures that 
>>>> corruption is reported unconditionally, while keeping the 
>>>> interval-specific hint optional.
>>>> 
>>>> Best regards,
>>>> --
>>>> Chao Li (Evan)
>>>> HighGo Software Co., Ltd.
>>>> https://www.highgo.com/
>>>> 
>>> 
>>> 
>>> uff, this looks like a clear oversight of d70b176.
>>> 
>>> Before d70b176 it was like this:
>>> 
>>> https://github.com/postgres/postgres/blame/fb9dff76635d4c32198f30a3cb503588d557d156/contrib/amcheck/verify_nbtree.c#L386-L399
>>> 
>>> 
>> 
>> Thanks for pointing out the origin code that seems to prove my fix is 
>> correct. But my patch adds “break” in the “for” loop, which makes it 
>> slightly better than the original version.
>> 
> 
> 
> OK LGTM then
> 
> 
> 
> -- 
> Best regards,
> Kirill Reshke

Hi Kirill,

Thanks for your review. I added the patch to CF: 
https://commitfest.postgresql.org/patch/6534/ for tracking purpose. Would you 
please make yourself a reviewer there.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/



Reply via email to