mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix tracking of temp table relation extensions as writes
Karina figured out that I (Andres) confused BufferUsage.temp_blks_written with BufferUsage.local_blks_written infcdda1e4b5. Tests in core PG can't easily test this, as BufferUsage is just used for EXPLAIN (ANALYZE, BUFFERS) and pg_stat_statements. Thus this commit adds tests for this to pg_stat_statements. Reported-by: Karina Litskevich <litskevichkarina@gmail.com> Author: Karina Litskevich <litskevichkarina@gmail.com> Author: Andres Freund <andres@anarazel.de> Discussion: https://postgr.es/m/CACiT8ibxXA6+0amGikbeFhm8B84XdQVo6D0Qfd1pQ1s8zpsnxQ@mail.gmail.com Backpatch: 16-, wherefcdda1e4b5was merged
This commit is contained in:
		@@ -139,6 +139,33 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
 | 
				
			|||||||
     1 |    1 | SELECT pg_stat_statements_reset()
 | 
					     1 |    1 | SELECT pg_stat_statements_reset()
 | 
				
			||||||
(10 rows)
 | 
					(10 rows)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- check that [temp] table relation extensions are tracked as writes
 | 
				
			||||||
 | 
					CREATE TABLE pgss_extend_tab (a int, b text);
 | 
				
			||||||
 | 
					CREATE TEMP TABLE pgss_extend_temp_tab (a int, b text);
 | 
				
			||||||
 | 
					SELECT pg_stat_statements_reset();
 | 
				
			||||||
 | 
					 pg_stat_statements_reset 
 | 
				
			||||||
 | 
					--------------------------
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					(1 row)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INSERT INTO pgss_extend_tab (a, b) SELECT generate_series(1, 1000), 'something';
 | 
				
			||||||
 | 
					INSERT INTO pgss_extend_temp_tab (a, b) SELECT generate_series(1, 1000), 'something';
 | 
				
			||||||
 | 
					WITH sizes AS (
 | 
				
			||||||
 | 
					  SELECT
 | 
				
			||||||
 | 
					    pg_relation_size('pgss_extend_tab') / current_setting('block_size')::int8 AS rel_size,
 | 
				
			||||||
 | 
					    pg_relation_size('pgss_extend_temp_tab') / current_setting('block_size')::int8 AS temp_rel_size
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					    SUM(local_blks_written) >= (SELECT temp_rel_size FROM sizes) AS temp_written_ok,
 | 
				
			||||||
 | 
					    SUM(local_blks_dirtied) >= (SELECT temp_rel_size FROM sizes) AS temp_dirtied_ok,
 | 
				
			||||||
 | 
					    SUM(shared_blks_written) >= (SELECT rel_size FROM sizes) AS written_ok,
 | 
				
			||||||
 | 
					    SUM(shared_blks_dirtied) >= (SELECT rel_size FROM sizes) AS dirtied_ok
 | 
				
			||||||
 | 
					FROM pg_stat_statements;
 | 
				
			||||||
 | 
					 temp_written_ok | temp_dirtied_ok | written_ok | dirtied_ok 
 | 
				
			||||||
 | 
					-----------------+-----------------+------------+------------
 | 
				
			||||||
 | 
					 t               | t               | t          | t
 | 
				
			||||||
 | 
					(1 row)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SELECT pg_stat_statements_reset();
 | 
					SELECT pg_stat_statements_reset();
 | 
				
			||||||
 pg_stat_statements_reset 
 | 
					 pg_stat_statements_reset 
 | 
				
			||||||
--------------------------
 | 
					--------------------------
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -73,4 +73,23 @@ MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a
 | 
				
			|||||||
DROP TABLE pgss_dml_tab;
 | 
					DROP TABLE pgss_dml_tab;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
 | 
					SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- check that [temp] table relation extensions are tracked as writes
 | 
				
			||||||
 | 
					CREATE TABLE pgss_extend_tab (a int, b text);
 | 
				
			||||||
 | 
					CREATE TEMP TABLE pgss_extend_temp_tab (a int, b text);
 | 
				
			||||||
 | 
					SELECT pg_stat_statements_reset();
 | 
				
			||||||
 | 
					INSERT INTO pgss_extend_tab (a, b) SELECT generate_series(1, 1000), 'something';
 | 
				
			||||||
 | 
					INSERT INTO pgss_extend_temp_tab (a, b) SELECT generate_series(1, 1000), 'something';
 | 
				
			||||||
 | 
					WITH sizes AS (
 | 
				
			||||||
 | 
					  SELECT
 | 
				
			||||||
 | 
					    pg_relation_size('pgss_extend_tab') / current_setting('block_size')::int8 AS rel_size,
 | 
				
			||||||
 | 
					    pg_relation_size('pgss_extend_temp_tab') / current_setting('block_size')::int8 AS temp_rel_size
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					SELECT
 | 
				
			||||||
 | 
					    SUM(local_blks_written) >= (SELECT temp_rel_size FROM sizes) AS temp_written_ok,
 | 
				
			||||||
 | 
					    SUM(local_blks_dirtied) >= (SELECT temp_rel_size FROM sizes) AS temp_dirtied_ok,
 | 
				
			||||||
 | 
					    SUM(shared_blks_written) >= (SELECT rel_size FROM sizes) AS written_ok,
 | 
				
			||||||
 | 
					    SUM(shared_blks_dirtied) >= (SELECT rel_size FROM sizes) AS dirtied_ok
 | 
				
			||||||
 | 
					FROM pg_stat_statements;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SELECT pg_stat_statements_reset();
 | 
					SELECT pg_stat_statements_reset();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -431,7 +431,7 @@ ExtendBufferedRelLocal(BufferManagerRelation bmr,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	*extended_by = extend_by;
 | 
						*extended_by = extend_by;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pgBufferUsage.temp_blks_written += extend_by;
 | 
						pgBufferUsage.local_blks_written += extend_by;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return first_block;
 | 
						return first_block;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user