From f66fcc5cd616da8d81a2d2f9b80a9f080796f4b6 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Fri, 1 Dec 2023 10:14:36 +0530 Subject: [PATCH] Fix an uninitialized access in hash_xlog_squeeze_page(). Commit 861f86beea changed hash_xlog_squeeze_page() to start reading the write buffer conditionally but forgot to initialize it leading to an uninitialized access. Reported-by: Alexander Lakhin Author: Hayato Kuroda Reviewed-by: Alexander Lakhin, Amit Kapila Discussion: http://postgr.es/m/62ed1a9f-746a-8e86-904b-51b9b806a1d9@gmail.com --- src/backend/access/hash/hash_xlog.c | 2 +- src/test/regress/expected/hash_index.out | 14 ++++++++++++++ src/test/regress/sql/hash_index.sql | 17 +++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/backend/access/hash/hash_xlog.c b/src/backend/access/hash/hash_xlog.c index 40debf4028..f1e233a817 100644 --- a/src/backend/access/hash/hash_xlog.c +++ b/src/backend/access/hash/hash_xlog.c @@ -632,7 +632,7 @@ hash_xlog_squeeze_page(XLogReaderState *record) XLogRecPtr lsn = record->EndRecPtr; xl_hash_squeeze_page *xldata = (xl_hash_squeeze_page *) XLogRecGetData(record); Buffer bucketbuf = InvalidBuffer; - Buffer writebuf; + Buffer writebuf = InvalidBuffer; Buffer ovflbuf; Buffer prevbuf = InvalidBuffer; Buffer mapbuf; diff --git a/src/test/regress/expected/hash_index.out b/src/test/regress/expected/hash_index.out index 0df348b5dd..0d4bdb2ade 100644 --- a/src/test/regress/expected/hash_index.out +++ b/src/test/regress/expected/hash_index.out @@ -298,6 +298,20 @@ ROLLBACK; INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; CHECKPOINT; VACUUM hash_cleanup_heap; +TRUNCATE hash_cleanup_heap; +-- Insert tuples to both the primary bucket page and overflow pages. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; +-- Fill overflow pages by "dead" tuples. +BEGIN; +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 1500) as i; +ROLLBACK; +-- And insert some tuples again. During squeeze operation, these will be moved +-- to other overflow pages and also allow overflow pages filled by dead tuples +-- to be freed. Note the main purpose of this test is to test the case where +-- we don't need to move any tuple from the overflow page being freed. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 50) as i; +CHECKPOINT; +VACUUM hash_cleanup_heap; -- Clean up. DROP TABLE hash_cleanup_heap; -- Index on temp table. diff --git a/src/test/regress/sql/hash_index.sql b/src/test/regress/sql/hash_index.sql index 943bd0ecf1..219da82981 100644 --- a/src/test/regress/sql/hash_index.sql +++ b/src/test/regress/sql/hash_index.sql @@ -284,6 +284,23 @@ INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; CHECKPOINT; VACUUM hash_cleanup_heap; +TRUNCATE hash_cleanup_heap; + +-- Insert tuples to both the primary bucket page and overflow pages. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; +-- Fill overflow pages by "dead" tuples. +BEGIN; +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 1500) as i; +ROLLBACK; +-- And insert some tuples again. During squeeze operation, these will be moved +-- to other overflow pages and also allow overflow pages filled by dead tuples +-- to be freed. Note the main purpose of this test is to test the case where +-- we don't need to move any tuple from the overflow page being freed. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 50) as i; + +CHECKPOINT; +VACUUM hash_cleanup_heap; + -- Clean up. DROP TABLE hash_cleanup_heap;