mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-29 22:49:41 +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