提交 990941ff 编写于 作者: H Heikki Linnakangas

Fix pg_relation_size() for non-main forks.

When dispatching the pg_relation_size() call to the segments, we were not
passing through the fork name. As a result, it always calculated the size
of the 'main' fork, regardless of the fork argument.

This has been wrong since the 8.4 merge, which introduced relation forks.
上级 c6d00df9
......@@ -440,6 +440,7 @@ pg_relation_size(PG_FUNCTION_ARGS)
{
Oid relOid = PG_GETARG_OID(0);
text *forkName = PG_GETARG_TEXT_P(1);
ForkNumber forkNumber;
Relation rel;
int64 size = 0;
......@@ -463,17 +464,19 @@ pg_relation_size(PG_FUNCTION_ARGS)
if (rel == NULL)
PG_RETURN_NULL();
forkNumber = forkname_to_number(text_to_cstring(forkName));
if (relOid == 0 || rel->rd_node.relNode == 0)
size = 0;
else
size = calculate_relation_size(rel,
forkname_to_number(text_to_cstring(forkName)));
size = calculate_relation_size(rel, forkNumber);
if (Gp_role == GP_ROLE_DISPATCH)
{
char *sql;
sql = psprintf("select pg_catalog.pg_relation_size(%u)", relOid);
sql = psprintf("select pg_catalog.pg_relation_size(%u, '%s')", relOid,
forkNames[forkNumber]);
size += get_size_from_segDBs(sql);
}
......
......@@ -149,6 +149,12 @@ select pg_relation_size('heapsizetest') between 3000000 and 5000000; -- 3637248
t
(1 row)
select pg_relation_size('heapsizetest', 'fsm') between 250000 and 350000; -- 294912
?column?
----------
t
(1 row)
select pg_table_size('heapsizetest') between 3000000 and 5000000; -- 4030464
?column?
----------
......@@ -216,12 +222,18 @@ CREATE TABLE aosizetest (a int) WITH (appendonly=true, orientation=row);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Greenplum Database data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
insert into aosizetest select generate_series(1, 100000);
select pg_relation_size('aosizetest') between 750000 and 1500000; --1001648
select pg_relation_size('aosizetest') between 750000 and 1500000; -- 1001648
?column?
----------
t
(1 row)
select pg_relation_size('aosizetest', 'fsm'); -- 0
pg_relation_size
------------------
0
(1 row)
select pg_table_size('aosizetest') between 1000000 and 1500000; -- 1263792
?column?
----------
......@@ -256,6 +268,12 @@ select pg_relation_size('aocssizetest') between 1000000 and 2000000; -- 1491240
t
(1 row)
select pg_relation_size('aocssizetest', 'fsm'); -- 0
pg_relation_size
------------------
0
(1 row)
select pg_table_size('aocssizetest') between 1500000 and 3000000; -- 1884456
?column?
----------
......
......@@ -56,6 +56,7 @@ vacuum heapsizetest;
-- Check that the values are in an expected ranges.
select pg_relation_size('heapsizetest') between 3000000 and 5000000; -- 3637248
select pg_relation_size('heapsizetest', 'fsm') between 250000 and 350000; -- 294912
select pg_table_size('heapsizetest') between 3000000 and 5000000; -- 4030464
select pg_table_size('heapsizetest') > pg_relation_size('heapsizetest');
select pg_indexes_size('heapsizetest');
......@@ -74,7 +75,8 @@ select pg_total_relation_size('heapsizetest') = pg_table_size('heapsizetest') +
-- Test on AO and AOCS tables
CREATE TABLE aosizetest (a int) WITH (appendonly=true, orientation=row);
insert into aosizetest select generate_series(1, 100000);
select pg_relation_size('aosizetest') between 750000 and 1500000; --1001648
select pg_relation_size('aosizetest') between 750000 and 1500000; -- 1001648
select pg_relation_size('aosizetest', 'fsm'); -- 0
select pg_table_size('aosizetest') between 1000000 and 1500000; -- 1263792
select pg_table_size('aosizetest') > pg_relation_size('aosizetest');
select pg_total_relation_size('aosizetest') between 1000000 and 1500000; -- 1263792
......@@ -83,6 +85,7 @@ select pg_total_relation_size('aosizetest') = pg_table_size('aosizetest');
CREATE TABLE aocssizetest (a int, col1 int, col2 text) WITH (appendonly=true, orientation=column);
insert into aocssizetest select g, g, 'x' || g from generate_series(1, 100000) g;
select pg_relation_size('aocssizetest') between 1000000 and 2000000; -- 1491240
select pg_relation_size('aocssizetest', 'fsm'); -- 0
select pg_table_size('aocssizetest') between 1500000 and 3000000; -- 1884456
select pg_table_size('aocssizetest') > pg_relation_size('aocssizetest');
select pg_total_relation_size('aocssizetest') between 1500000 and 3000000; -- 1884456
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册