Re: Fix overflow of nbatch
Tomas Vondra <tomas@vondra.me>
From: Tomas Vondra <tomas@vondra.me>
To: David Rowley <dgrowleyml@gmail.com>, Vaibhav Jain <jainva@google.com>
Cc: pgsql-hackers@postgresql.org, Madhukar <madhukarprasad@google.com>,
Sangeetha Seshadri <sangsesh@google.com>
Date: 2025-09-22T21:31:31Z
Lists: pgsql-hackers
On 9/22/25 22:45, David Rowley wrote: > On Tue, 23 Sept 2025 at 01:57, Vaibhav Jain <jainva@google.com> wrote: >> With a1b4f28, to compute current_space, nbatch is being multiplied >> by BLCKSZ. nbatch is int and when multiplied with BLCKSZ, it can >> easily overflow the int limit.To keep the calculation safe for >> current_space, convert nbatch to size_t. > > Thanks for finding and reporting this. > > I think a1b4f289b mistakenly thought that there'd be size_t arithmetic > in the following two lines because the final result is a size_t: > > size_t current_space = hash_table_bytes + (2 * nbatch * BLCKSZ); > size_t new_space = hash_table_bytes * 2 + (nbatch * BLCKSZ); > Yeah, I failed to notice this part of the formula can overflow. > I'd rather see this fixed by adding a cast, i.e.: "(size_t) nbatch" on > the above two lines. All that code is new in a1b4f289b, and if you > change the nbatch to a size_t it affects the code that existed before > a1b4f289b, and from looking over that code, it seems to ensure that > nbatch does not overflow int by doing "dbatch = Min(dbatch, > max_pointers);", where max_pointers is constrained by MaxAllocSize / > sizeof(HashJoinTuple). > > Also, making nbatches size_t makes the final line of " *numbatches = > nbatch;" somewhat questionable since numbatches is an int pointer. > It seems cleaner to add a the cast to the formula, if only because of the assignment to numbatches. thanks -- Tomas Vondra
Commits
-
Fix hashjoin memory balancing logic
- aa151022ec13 18.1 landed
- b85c4700fc51 19 (unreleased) landed