Fix bogus use of "long" in aset.c
David Rowley <dgrowleyml@gmail.com>
From: David Rowley <dgrowleyml@gmail.com>
To: PostgreSQL Developers <pgsql-hackers@lists.postgresql.org>
Date: 2025-10-29T23:07:08Z
Lists: pgsql-hackers
Attachments
- fix_AllocSetCheck_to_use_Size.patch (application/octet-stream) patch
While reviewing another patch, I was playing around with a test case to trigger a large memory allocation. I was doing this on Windows when I got a nasty looking WARNING in a MEMORY_CONTEXT_CHECKING build: create table t (a int); insert into t values(1); alter table t alter column a set (n_distinct = -1); -- all values distinct analyze t; update pg_class set reltuples = 1e9 where oid = 't'::regclass; -- hack to make the table big set work_mem = '4GB'; explain (summary on) select a from t except select a from t; and got: WARNING: problem in alloc set ExecutorState: bad single-chunk 0000023DE7C98098 in block 0000023DE7C98070 WARNING: problem in alloc set ExecutorState: bad single-chunk 0000023DE7C98098 in block 0000023DE7C98070 It turns out that AllocSetCheck() thinks "long" is a good datatype to store the difference between 2 pointers. That's not going to work well on 64-bit Windows as long is 32-bit. I did also consider [u]intptr_t, but thought Size was better as that's what chsize is. Trivial fix attached. David
Commits
-
Fix bogus use of "long" in AllocSetCheck()
- 7b955c2279f4 13.23 landed
- 86bd9497f87d 14.20 landed
- f3420e006ec0 15.15 landed
- cdc04a6c3399 16.11 landed
- bd6f986c9e0e 17.7 landed
- af3a79e0837d 18.1 landed
- 50eb4e118156 19 (unreleased) landed