Using HEAD, create table t1 as select generate_series(1,40000000) id; vacuum analyze t1; explain select * from t1, t1 t1b where t1.id = t1b.id; -- should indicate a hash join explain analyze select * from t1, t1 t1b where t1.id = t1b.id;
... watch the process's memory consumption bloat. (It runs for awhile before that starts to happen, but eventually it goes to a couple of GB.) It looks to me like the problem is that ExecHashJoinGetSavedTuple calls ExecForceStoreMinimalTuple with shouldFree = true, and ExecForceStoreMinimalTuple's second code branch simply ignores the requirement to free the supplied tuple. regards, tom lane