Skip to content

Commit 1b0b3be

Browse files
committed
Fix for 68edd02: Do not call hash_seq_term(), we can't trust to its pointer in the callback function
1 parent e5af4d3 commit 1b0b3be

File tree

3 files changed

+41
-23
lines changed

3 files changed

+41
-23
lines changed

expected/pg_variables.out

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -553,20 +553,6 @@ SELECT pgv_insert('vars3', 'r1', row(1, 1));
553553
ERROR: new record structure differs from variable "r1" structure
554554
SELECT pgv_insert('vars3', 'r1', row('str1', 'str1'));
555555
ERROR: new record structure differs from variable "r1" structure
556-
SELECT pgv_select('vars3', 'r1') LIMIT 2;
557-
pgv_select
558-
------------
559-
(,strNULL)
560-
(1,str11)
561-
(2 rows)
562-
563-
SELECT pgv_select('vars3', 'r1') LIMIT 2 OFFSET 2;
564-
pgv_select
565-
------------
566-
(2,)
567-
(0,str00)
568-
(2 rows)
569-
570556
SELECT pgv_select('vars3', 'r1');
571557
pgv_select
572558
------------
@@ -657,6 +643,35 @@ SELECT pgv_exists('vars3', 'r1');
657643

658644
SELECT pgv_select('vars2', 'j1');
659645
ERROR: variable "j1" requires "jsonb" value
646+
-- Tests for SRF's sequential scan of an internal hash table
647+
DO
648+
$$BEGIN
649+
PERFORM pgv_select('vars3', 'r1') LIMIT 2 OFFSET 2;
650+
PERFORM pgv_select('vars3', 'r3');
651+
END$$;
652+
ERROR: unrecognized variable "r3"
653+
CONTEXT: SQL statement "SELECT pgv_select('vars3', 'r3')"
654+
PL/pgSQL function inline_code_block line 3 at PERFORM
655+
-- Check that the hash table was cleaned up after rollback
656+
SELECT pgv_select('vars3', 'r1', 1);
657+
pgv_select
658+
------------
659+
660+
(1 row)
661+
662+
SELECT pgv_select('vars3', 'r1') LIMIT 2;
663+
pgv_select
664+
------------
665+
(,strNULL)
666+
(2,)
667+
(2 rows)
668+
669+
SELECT pgv_select('vars3', 'r1') LIMIT 2 OFFSET 2;
670+
pgv_select
671+
------------
672+
(0,str00)
673+
(1 row)
674+
660675
-- Manipulate variables
661676
SELECT * FROM pgv_list() order by package, name;
662677
package | name | is_transactional

pg_variables.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2121,14 +2121,9 @@ pgvTransCallback(XactEvent event, void *arg)
21212121
}
21222122
}
21232123

2124-
if (event == XACT_EVENT_PARALLEL_COMMIT || event == XACT_EVENT_COMMIT ||
2125-
event == XACT_EVENT_PREPARE ||
2126-
event == XACT_EVENT_PARALLEL_ABORT || event == XACT_EVENT_ABORT)
2124+
if (event == XACT_EVENT_PARALLEL_ABORT || event == XACT_EVENT_ABORT)
21272125
if (LastHSeqStatus)
2128-
{
2129-
hash_seq_term(LastHSeqStatus);
21302126
LastHSeqStatus = NULL;
2131-
}
21322127
}
21332128

21342129
/*

sql/pg_variables.sql

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,6 @@ SELECT pgv_insert('vars3', 'r1', row(1, 'str1', 'str2'));
153153
SELECT pgv_insert('vars3', 'r1', row(1, 1));
154154
SELECT pgv_insert('vars3', 'r1', row('str1', 'str1'));
155155

156-
SELECT pgv_select('vars3', 'r1') LIMIT 2;
157-
SELECT pgv_select('vars3', 'r1') LIMIT 2 OFFSET 2;
158-
159156
SELECT pgv_select('vars3', 'r1');
160157
SELECT pgv_select('vars3', 'r1', 1);
161158
SELECT pgv_select('vars3', 'r1', 0);
@@ -175,6 +172,17 @@ SELECT pgv_exists('vars3', 'r3');
175172
SELECT pgv_exists('vars3', 'r1');
176173
SELECT pgv_select('vars2', 'j1');
177174

175+
-- Tests for SRF's sequential scan of an internal hash table
176+
DO
177+
$$BEGIN
178+
PERFORM pgv_select('vars3', 'r1') LIMIT 2 OFFSET 2;
179+
PERFORM pgv_select('vars3', 'r3');
180+
END$$;
181+
-- Check that the hash table was cleaned up after rollback
182+
SELECT pgv_select('vars3', 'r1', 1);
183+
SELECT pgv_select('vars3', 'r1') LIMIT 2;
184+
SELECT pgv_select('vars3', 'r1') LIMIT 2 OFFSET 2;
185+
178186
-- Manipulate variables
179187
SELECT * FROM pgv_list() order by package, name;
180188
SELECT package FROM pgv_stats() order by package;

0 commit comments

Comments
 (0)