Skip to content

Commit 41af6ff

Browse files
committed
Fix misreported toast_size in chunk_relation_size funcs
A bug in the SQL for getting the size of chunks would use the TOAST size of the main/dummy table as the toast size for the chunks rather than each chunks' own toast size.
1 parent 2ec065b commit 41af6ff

File tree

3 files changed

+47
-8
lines changed

3 files changed

+47
-8
lines changed

sql/size_utils.sql

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
--
1010
-- Returns:
1111
-- table_bytes - Disk space used by main_table (like pg_relation_size(main_table))
12-
-- index_bytes - Disc space used by indexes
13-
-- toast_bytes - Disc space of toast tables
12+
-- index_bytes - Disk space used by indexes
13+
-- toast_bytes - Disk space of toast tables
1414
-- total_bytes - Total disk space used by the specified table, including all indexes and TOAST data
1515

1616
CREATE OR REPLACE FUNCTION hypertable_relation_size(
@@ -162,7 +162,7 @@ $BODY$;
162162
-- ranges - Partition ranges for each dimension of the chunk
163163
-- table_bytes - Disk space used by main_table
164164
-- index_bytes - Disk space used by indexes
165-
-- toast_bytes - Disc space of toast tables
165+
-- toast_bytes - Disk space of toast tables
166166
-- total_bytes - Disk space used in total
167167

168168
CREATE OR REPLACE FUNCTION chunk_relation_size(
@@ -227,9 +227,9 @@ BEGIN
227227
pg_namespace pns
228228
WHERE h.schema_name = %L
229229
AND h.table_name = %L
230-
AND pgc.relname = h.table_name
230+
AND pgc.relname = c.table_name
231231
AND pns.oid = pgc.relnamespace
232-
AND pns.nspname = h.schema_name
232+
AND pns.nspname = c.schema_name
233233
AND relkind = 'r'
234234
AND c.hypertable_id = h.id
235235
AND c.id = cc.chunk_id
@@ -328,9 +328,9 @@ BEGIN
328328
pg_namespace pns
329329
WHERE h.schema_name = %L
330330
AND h.table_name = %L
331-
AND pgc.relname = h.table_name
331+
AND pgc.relname = c.table_name
332332
AND pns.oid = pgc.relnamespace
333-
AND pns.nspname = h.schema_name
333+
AND pns.nspname = c.schema_name
334334
AND relkind = 'r'
335335
AND c.hypertable_id = h.id
336336
AND c.id = cc.chunk_id

test/expected/size_utils.out

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,32 @@ SELECT * FROM chunk_relation_size_pretty('timestamp_partitioned_2');
139139
8 | "_timescaledb_internal"."_hyper_3_8_chunk" | {time,value} | {"timestamp without time zone",character} | {NULL,_timescaledb_internal.get_partition_hash} | {"['Sat Nov 27 16:00:00 2004 PST','Mon Dec 27 16:00:00 2004 PST')","[1073741823,)"} | 8192 bytes | 32 kB | | 40 kB
140140
(2 rows)
141141

142+
CREATE TABLE toast_test(time TIMESTAMP, value TEXT);
143+
-- Set storage type to EXTERNAL to prevent PostgreSQL from compressing my
144+
-- easily compressable string and instead store it with TOAST
145+
ALTER TABLE toast_test ALTER COLUMN value SET STORAGE EXTERNAL;
146+
SELECT * FROM create_hypertable('toast_test', 'time');
147+
NOTICE: adding NOT NULL constraint to column "time"
148+
create_hypertable
149+
-------------------
150+
151+
(1 row)
152+
153+
INSERT INTO toast_test VALUES('2004-10-19 10:23:54', $$
154+
this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k.
155+
$$);
156+
SELECT * FROM chunk_relation_size('toast_test');
157+
chunk_id | chunk_table | partitioning_columns | partitioning_column_types | partitioning_hash_functions | ranges | table_bytes | index_bytes | toast_bytes | total_bytes
158+
----------+--------------------------------------------+----------------------+---------------------------------+-----------------------------+-----------------------------------------+-------------+-------------+-------------+-------------
159+
9 | "_timescaledb_internal"."_hyper_4_9_chunk" | {time} | {"timestamp without time zone"} | {NULL} | {"[1096416000000000,1099008000000000)"} | 8192 | 16384 | 24576 | 49152
160+
(1 row)
161+
162+
SELECT * FROM chunk_relation_size_pretty('toast_test');
163+
chunk_id | chunk_table | partitioning_columns | partitioning_column_types | partitioning_hash_functions | ranges | table_size | index_size | toast_size | total_size
164+
----------+--------------------------------------------+----------------------+---------------------------------+-----------------------------+---------------------------------------------------------------------+------------+------------+------------+------------
165+
9 | "_timescaledb_internal"."_hyper_4_9_chunk" | {time} | {"timestamp without time zone"} | {NULL} | {"['Tue Sep 28 17:00:00 2004 PDT','Thu Oct 28 17:00:00 2004 PDT')"} | 8192 bytes | 16 kB | 24 kB | 48 kB
166+
(1 row)
167+
142168
CREATE TABLE approx_count(time TIMESTAMP, value int);
143169
SELECT * FROM create_hypertable('approx_count', 'time');
144170
NOTICE: adding not-null constraint to column "time"
@@ -171,6 +197,7 @@ SELECT * FROM hypertable_approximate_row_count();
171197
public | approx_count | 10
172198
public | timestamp_partitioned | 0
173199
public | timestamp_partitioned_2 | 0
200+
public | toast_test | 0
174201
public | two_Partitions | 0
175-
(4 rows)
202+
(5 rows)
176203

test/sql/size_utils.sql

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@ INSERT INTO timestamp_partitioned_2 VALUES('2004-12-19 10:23:54', '30');
2424
SELECT * FROM chunk_relation_size('timestamp_partitioned_2');
2525
SELECT * FROM chunk_relation_size_pretty('timestamp_partitioned_2');
2626

27+
CREATE TABLE toast_test(time TIMESTAMP, value TEXT);
28+
-- Set storage type to EXTERNAL to prevent PostgreSQL from compressing my
29+
-- easily compressable string and instead store it with TOAST
30+
ALTER TABLE toast_test ALTER COLUMN value SET STORAGE EXTERNAL;
31+
SELECT * FROM create_hypertable('toast_test', 'time');
32+
33+
INSERT INTO toast_test VALUES('2004-10-19 10:23:54', $$
34+
this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k. this must be over 2k.
35+
$$);
36+
SELECT * FROM chunk_relation_size('toast_test');
37+
SELECT * FROM chunk_relation_size_pretty('toast_test');
38+
2739
CREATE TABLE approx_count(time TIMESTAMP, value int);
2840
SELECT * FROM create_hypertable('approx_count', 'time');
2941
INSERT INTO approx_count VALUES('2004-01-01 10:00:01', 1);

0 commit comments

Comments
 (0)