mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Set PD_ALL_VISIBLE and visibility map bits in COPY FREEZE
Make sure COPY FREEZE marks the pages as PD_ALL_VISIBLE and updates the visibility map. Until now we only marked individual tuples as frozen, but page-level flags were not updated, so the first VACUUM after the COPY FREEZE had to rewrite the whole table. This is a fairly old patch, and multiple people worked on it. The first version was written by Jeff Janes, and then reworked by Pavan Deolasee and Anastasia Lubennikova. Author: Anastasia Lubennikova, Pavan Deolasee, Jeff Janes Reviewed-by: Kuntal Ghosh, Jeff Janes, Tomas Vondra, Masahiko Sawada, Andres Freund, Ibrar Ahmed, Robert Haas, Tatsuro Ishii, Darafei Praliaskouski Discussion: https://postgr.es/m/CABOikdN-ptGv0mZntrK2Q8OtfUuAjqaYMGmkdU1dCKFtUxVLrg@mail.gmail.com Discussion: https://postgr.es/m/CAMkU%3D1w3osJJ2FneELhhNRLxfZitDgp9FPHee08NT2FQFmz_pQ%40mail.gmail.com
This commit is contained in:
@ -94,6 +94,82 @@ select count(*) > 0 from pg_visibility_map_summary('test_partition');
|
||||
select * from pg_check_frozen('test_partition'); -- hopefully none
|
||||
select pg_truncate_visibility_map('test_partition');
|
||||
|
||||
-- test copy freeze
|
||||
create table copyfreeze (a int, b char(1500));
|
||||
|
||||
-- load all rows via COPY FREEZE and ensure that all pages are set all-visible
|
||||
-- and all-frozen.
|
||||
begin;
|
||||
truncate copyfreeze;
|
||||
copy copyfreeze from stdin freeze;
|
||||
1 '1'
|
||||
2 '2'
|
||||
3 '3'
|
||||
4 '4'
|
||||
5 '5'
|
||||
6 '6'
|
||||
7 '7'
|
||||
8 '8'
|
||||
9 '9'
|
||||
10 '10'
|
||||
11 '11'
|
||||
12 '12'
|
||||
\.
|
||||
commit;
|
||||
select * from pg_visibility_map('copyfreeze');
|
||||
select * from pg_check_frozen('copyfreeze');
|
||||
|
||||
-- load half the rows via regular COPY and rest via COPY FREEZE. The pages
|
||||
-- which are touched by regular COPY must not be set all-visible/all-frozen. On
|
||||
-- the other hand, pages allocated by COPY FREEZE should be marked
|
||||
-- all-frozen/all-visible.
|
||||
begin;
|
||||
truncate copyfreeze;
|
||||
copy copyfreeze from stdin;
|
||||
1 '1'
|
||||
2 '2'
|
||||
3 '3'
|
||||
4 '4'
|
||||
5 '5'
|
||||
6 '6'
|
||||
\.
|
||||
copy copyfreeze from stdin freeze;
|
||||
7 '7'
|
||||
8 '8'
|
||||
9 '9'
|
||||
10 '10'
|
||||
11 '11'
|
||||
12 '12'
|
||||
\.
|
||||
commit;
|
||||
select * from pg_visibility_map('copyfreeze');
|
||||
select * from pg_check_frozen('copyfreeze');
|
||||
|
||||
-- Try a mix of regular COPY and COPY FREEZE.
|
||||
begin;
|
||||
truncate copyfreeze;
|
||||
copy copyfreeze from stdin freeze;
|
||||
1 '1'
|
||||
2 '2'
|
||||
3 '3'
|
||||
4 '4'
|
||||
5 '5'
|
||||
\.
|
||||
copy copyfreeze from stdin;
|
||||
6 '6'
|
||||
\.
|
||||
copy copyfreeze from stdin freeze;
|
||||
7 '7'
|
||||
8 '8'
|
||||
9 '9'
|
||||
10 '10'
|
||||
11 '11'
|
||||
12 '12'
|
||||
\.
|
||||
commit;
|
||||
select * from pg_visibility_map('copyfreeze');
|
||||
select * from pg_check_frozen('copyfreeze');
|
||||
|
||||
-- cleanup
|
||||
drop table test_partitioned;
|
||||
drop view test_view;
|
||||
@ -103,3 +179,4 @@ drop server dummy_server;
|
||||
drop foreign data wrapper dummy;
|
||||
drop materialized view matview_visibility_test;
|
||||
drop table regular_table;
|
||||
drop table copyfreeze;
|
||||
|
Reference in New Issue
Block a user