From: Masahiro Ikeda <ikedamsh@oss.nttdata.com>
To: Richard Guo <guofenglinux@gmail.com>
Cc: Dilip Kumar <dilipbalaut@gmail.com>
Cc: Fujii Masao <masao.fujii@oss.nttdata.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Subject: Re: Assertion failure in smgr.c when using pg_prewarm with partitioned tables
Date: Fri, 16 May 2025 15:21:11 +0900
Message-ID: <8829854bbfc8635ddecd0846bb72dfda@oss.nttdata.com> (raw)
In-Reply-To: <CAMbWs49T8hFr571c+b0T4GiDwKow5B1HUMMxav7qhUt75WHpKA@mail.gmail.com>
References: <e082e6027610fd0a4091ae6d033aa117@oss.nttdata.com>
<CAFiTN-tKxhMG0QNO1V3VNsfnhtkS=hrOJNj5Kxs6cGKtujdyhg@mail.gmail.com>
<7fde0acf-2395-44d8-b081-bfa0e10097dc@oss.nttdata.com>
<CAFiTN-vDKGHn76XkL2oTQVf5aCScKqs1GKf_aALGO5u7fuqNwg@mail.gmail.com>
<CAMbWs49T8hFr571c+b0T4GiDwKow5B1HUMMxav7qhUt75WHpKA@mail.gmail.com>
Thank you for your comments!
I updated the patch to use RELKIND_HAS_STORAGE() as done in
commit 4623d7144. Please see the v2-0001 patch for the changes.
On 2025-05-15 19:57, Richard Guo wrote:
> +1. FWIW, not long ago we fixed a similar Assert failure in
> contrib/pg_freespacemap by verifying RELKIND_HAS_STORAGE() before
> trying to access the storage (see 4623d7144). Wondering if there are
> other similar issues elsewhere in contrib ...
I tested all contrib functions that take regclass arguments (see
attached test.sql and test_result.txt). The result shows that only
pg_prewarm() can lead to the assertion failure.
However, I found that amcheck's error messages can be misleading
when run on partitioned indexes.
For example, on the master branch, amcheck (e.g., bt_index_check
function)
shows this error:
> ERROR: expected "btree" index as targets for verification
> DETAIL: Relation "pgbench_accounts_pkey" is a btree index.
This message says it expects a "btree" index, yet also states the
relation
is a "btree" index, which can seem contradictory. The actual issue is
that
the index is a btree partitioned index, but this detail is missing,
causing
possible confusion.
Therefore, I thought it would be better to update the detailed message
as shown in the v2-0002 patch:
* master with 0002 patch
> ERROR: expected "btree" index as targets for verification
> DETAIL: Relation "pgbench_accounts_pkey" is a btree partitioned
index.
Regards,
--
Masahiro Ikeda
NTT DATA CORPORATION
Attachments:download all (4 files, .tar.gz)test.sql (text/plain, 7.2K) download
-- 1. prepare
-- pgbench -i -s --partition=3
-- 2. check functions which has regclass arguments
-- prewarm
CREATE EXTENSION IF NOT EXISTS pg_prewarm;
SELECT pg_prewarm('pgbench_accounts');
SELECT pg_prewarm('pgbench_accounts_1');
SELECT pg_prewarm('pgbench_accounts_pkey');
SELECT pg_prewarm('pgbench_accounts_1_pkey');
-- amcheck
CREATE EXTENSION IF NOT EXISTS amcheck;
SELECT bt_index_check('pgbench_accounts'::regclass, true, true);
SELECT bt_index_check('pgbench_accounts_1'::regclass, true, true);
SELECT bt_index_check('pgbench_accounts_pkey'::regclass, true, true);
SELECT bt_index_check('pgbench_accounts_1_pkey'::regclass, true, true);
SELECT bt_index_parent_check('pgbench_accounts'::regclass, true, true);
SELECT bt_index_parent_check('pgbench_accounts_1'::regclass, true, true);
SELECT bt_index_parent_check('pgbench_accounts_pkey'::regclass, true, true);
SELECT bt_index_parent_check('pgbench_accounts_1_pkey'::regclass, true, true);
SELECT gin_index_check('pgbench_accounts'::regclass);
SELECT gin_index_check('pgbench_accounts_1'::regclass);
SELECT gin_index_check('pgbench_accounts_pkey'::regclass);
SELECT gin_index_check('pgbench_accounts_1_pkey'::regclass);
SELECT verify_heapam('pgbench_accounts'::regclass);
SELECT verify_heapam('pgbench_accounts_1'::regclass);
SELECT verify_heapam('pgbench_accounts_pkey'::regclass);
SELECT verify_heapam('pgbench_accounts_1_pkey'::regclass);
-- brin
SELECT brin_summarize_new_values('pgbench_accounts'::regclass);
SELECT brin_summarize_new_values('pgbench_accounts_1'::regclass);
SELECT brin_summarize_new_values('pgbench_accounts_pkey'::regclass);
SELECT brin_summarize_new_values('pgbench_accounts_1_pkey'::regclass);
SELECT brin_summarize_range('pgbench_accounts'::regclass, 1);
SELECT brin_summarize_range('pgbench_accounts_1'::regclass, 1);
SELECT brin_summarize_range('pgbench_accounts_pkey'::regclass, 1);
SELECT brin_summarize_range('pgbench_accounts_1_pkey'::regclass, 1);
SELECT brin_desummarize_range('pgbench_accounts'::regclass, 1);
SELECT brin_desummarize_range('pgbench_accounts_1'::regclass, 1);
SELECT brin_desummarize_range('pgbench_accounts_pkey'::regclass, 1);
SELECT brin_desummarize_range('pgbench_accounts_1_pkey'::regclass, 1);
-- pageinspect
CREATE EXTENSION IF NOT EXISTS pageinspect;
SELECT tuple_data_split(
'pgbench_accounts'::regclass,
t_data, t_infomask, t_infomask2, t_bits
)
FROM heap_page_items(get_raw_page('pgbench_accounts_1', 2)) LIMIT 1;
SELECT tuple_data_split(
'pgbench_accounts_1'::regclass,
t_data, t_infomask, t_infomask2, t_bits
)
FROM heap_page_items(get_raw_page('pgbench_accounts_1', 2)) LIMIT 1;
SELECT tuple_data_split(
'pgbench_accounts_pkey'::regclass,
t_data, t_infomask, t_infomask2, t_bits
)
FROM heap_page_items(get_raw_page('pgbench_accounts_1', 2)) LIMIT 1;
SELECT tuple_data_split(
'pgbench_accounts_1_pkey'::regclass,
t_data, t_infomask, t_infomask2, t_bits
)
FROM heap_page_items(get_raw_page('pgbench_accounts_1', 2)) LIMIT 1;
SELECT * FROM heap_page_item_attrs(
get_raw_page('pgbench_accounts', 0),
'pgbench_accounts'::regclass
) LIMIT 1;
SELECT * FROM heap_page_item_attrs(
get_raw_page('pgbench_accounts_1', 0),
'pgbench_accounts_1'::regclass
) LIMIT 1;
SELECT * FROM heap_page_item_attrs(
get_raw_page('pgbench_accounts_pkey', 0),
'pgbench_accounts_pkey'::regclass
) LIMIT 1;
SELECT * FROM heap_page_item_attrs(
get_raw_page('pgbench_accounts_1_pkey', 0),
'pgbench_accounts_1_pkey'::regclass
) LIMIT 1;
SELECT * FROM gist_page_items(
get_raw_page('pgbench_accounts', 1),
'pgbench_accounts'::regclass
);
SELECT * FROM gist_page_items(
get_raw_page('pgbench_accounts_1', 1),
'pgbench_accounts_1'::regclass
);
SELECT * FROM gist_page_items(
get_raw_page('pgbench_accounts_pkey', 1),
'pgbench_accounts_pkey'::regclass
);
SELECT * FROM gist_page_items(
get_raw_page('pgbench_accounts_1_pkey', 1),
'pgbench_accounts_1_pkey'::regclass
);
-- pgstattuple
CREATE EXTENSION IF NOT EXISTS pgstattuple;
SELECT * FROM pgstattuple('pgbench_accounts');
SELECT * FROM pgstattuple('pgbench_accounts_1');
SELECT * FROM pgstattuple('pgbench_accounts_pkey');
SELECT * FROM pgstattuple('pgbench_accounts_1_pkey');
SELECT * FROM pgstatindex('pgbench_accounts_pkey');
SELECT * FROM pgstatindex('pgbench_accounts_1_pkey');
SELECT * FROM pgstatindex('pgbench_accounts');
SELECT * FROM pgstatindex('pgbench_accounts_1');
SELECT * FROM pgstatginindex('pgbench_accounts_pkey');
SELECT * FROM pgstatginindex('pgbench_accounts_1_pkey');
SELECT * FROM pgstatginindex('pgbench_accounts');
SELECT * FROM pgstatginindex('pgbench_accounts_1');
SELECT * FROM pgstathashindex('pgbench_accounts_pkey');
SELECT * FROM pgstathashindex('pgbench_accounts_1_pkey');
SELECT * FROM pgstathashindex('pgbench_accounts');
SELECT * FROM pgstathashindex('pgbench_accounts_1');
SELECT pg_relpages('pgbench_accounts');
SELECT pg_relpages('pgbench_accounts_1');
SELECT pg_relpages('pgbench_accounts_pkey');
SELECT pg_relpages('pgbench_accounts_1_pkey');
SELECT * FROM pgstattuple_approx('pgbench_accounts');
SELECT * FROM pgstattuple_approx('pgbench_accounts_1');
SELECT * FROM pgstattuple_approx('pgbench_accounts_pkey');
SELECT * FROM pgstattuple_approx('pgbench_accounts_1_pkey');
-- pg_surgery
CREATE EXTENSION IF NOT EXISTS pg_surgery;
SELECT heap_force_kill('pgbench_accounts', ARRAY['(0, 1)']::tid[]);
SELECT heap_force_kill('pgbench_accounts_1', ARRAY['(0, 1)']::tid[]);
SELECT heap_force_kill('pgbench_accounts_pkey', ARRAY['(0, 1)']::tid[]);
SELECT heap_force_kill('pgbench_accounts_1_pkey', ARRAY['(0, 1)']::tid[]);
SELECT heap_force_freeze('pgbench_accounts', ARRAY['(0, 1)']::tid[]);
SELECT heap_force_freeze('pgbench_accounts_1', ARRAY['(0, 1)']::tid[]);
SELECT heap_force_freeze('pgbench_accounts_pkey', ARRAY['(0, 1)']::tid[]);
SELECT heap_force_freeze('pgbench_accounts_1_pkey', ARRAY['(0, 1)']::tid[]);
-- pg_visibility
CREATE EXTENSION IF NOT EXISTS pg_visibility;
SELECT * FROM pg_visibility_map('pgbench_accounts') LIMIT 1;
SELECT * FROM pg_visibility_map('pgbench_accounts_1') LIMIT 1;
SELECT * FROM pg_visibility_map('pgbench_accounts_pkey') LIMIT 1;
SELECT * FROM pg_visibility_map('pgbench_accounts_1_pkey') LIMIT 1;
SELECT * FROM pg_visibility('pgbench_accounts') LIMIT 1;
SELECT * FROM pg_visibility('pgbench_accounts_1') LIMIT 1;
SELECT * FROM pg_visibility('pgbench_accounts_pkey') LIMIT 1;
SELECT * FROM pg_visibility('pgbench_accounts_1_pkey') LIMIT 1;
SELECT * FROM pg_visibility_map_summary('pgbench_accounts');
SELECT * FROM pg_visibility_map_summary('pgbench_accounts_1');
SELECT * FROM pg_visibility_map_summary('pgbench_accounts_pkey');
SELECT * FROM pg_visibility_map_summary('pgbench_accounts_1_pkey');
SELECT * FROM pg_check_frozen('pgbench_accounts');
SELECT * FROM pg_check_frozen('pgbench_accounts_1');
SELECT * FROM pg_check_frozen('pgbench_accounts_pkey');
SELECT * FROM pg_check_frozen('pgbench_accounts_1_pkey');
SELECT * FROM pg_check_visible('pgbench_accounts');
SELECT * FROM pg_check_visible('pgbench_accounts_1');
SELECT * FROM pg_check_visible('pgbench_accounts_pkey');
SELECT * FROM pg_check_visible('pgbench_accounts_1_pkey');
SELECT pg_truncate_visibility_map('pgbench_accounts');
SELECT pg_truncate_visibility_map('pgbench_accounts_1');
SELECT pg_truncate_visibility_map('pgbench_accounts_pkey');
SELECT pg_truncate_visibility_map('pgbench_accounts_1_pkey');
v2-0001-Fix-assertion-failure-when-pg_prewarm-is-run-on-o.patch (text/x-diff, 2.7K) download
From db240142ab4de334ef072f6af59a792701e806c5 Mon Sep 17 00:00:00 2001
From: Masahiro Ikeda <ikedamsh@oss.nttdata.com>
Date: Fri, 16 May 2025 14:35:32 +0900
Subject: [PATCH v2 1/2] Fix assertion failure when pg_prewarm() is run on
objects that don't have storage.
This issue was introduced by commit 049ef33.
Specifying objects that don't have storage as an argument to
pg_prewarm() could trigger an assertion failure:
Failed Assert("RelFileNumberIsValid(rlocator.relNumber)")
This fix ensures that such cases are handled appropriately.
---
contrib/pg_prewarm/pg_prewarm.c | 8 ++++++++
contrib/pg_prewarm/t/001_basic.pl | 11 ++++++++++-
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/contrib/pg_prewarm/pg_prewarm.c b/contrib/pg_prewarm/pg_prewarm.cindex 50808569bd7..1f89c9adc86 100644--- a/contrib/pg_prewarm/pg_prewarm.c+++ b/contrib/pg_prewarm/pg_prewarm.c@@ -112,6 +112,14 @@ pg_prewarm(PG_FUNCTION_ARGS)
if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, get_relkind_objtype(rel->rd_rel->relkind), get_rel_name(relOid));
+ /* Check that the storage exists. */+ if (!RELKIND_HAS_STORAGE(rel->rd_rel->relkind))+ ereport(ERROR,+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),+ errmsg("relation \"%s\" does not have storage",+ RelationGetRelationName(rel)),+ errdetail_relkind_not_supported(rel->rd_rel->relkind)));+
/* Check that the fork exists. */
if (!smgrexists(RelationGetSmgr(rel), forkNumber))
ereport(ERROR,
diff --git a/contrib/pg_prewarm/t/001_basic.pl b/contrib/pg_prewarm/t/001_basic.plindex 0a8259d3678..f7c31ae60a8 100644--- a/contrib/pg_prewarm/t/001_basic.pl+++ b/contrib/pg_prewarm/t/001_basic.pl@@ -23,7 +23,10 @@ $node->start;
$node->safe_psql("postgres",
"CREATE EXTENSION pg_prewarm;\n"
. "CREATE TABLE test(c1 int);\n"
- . "INSERT INTO test SELECT generate_series(1, 100);");+ . "INSERT INTO test SELECT generate_series(1, 100);\n"+ . "CREATE TABLE test_part(c1 int) PARTITION BY RANGE (c1);\n"+ . "CREATE TABLE test_part1 PARTITION OF test_part FOR VALUES FROM (1) TO (1000);\n"+ . "INSERT INTO test_part SELECT generate_series(1, 100);");
# test read mode
my $result =
@@ -42,6 +45,12 @@ ok( ( $stdout =~ qr/^[1-9][0-9]*$/
or $stderr =~ qr/prefetch is not supported by this build/),
'prefetch mode succeeded');
+# test partition table+($cmdret, $stdout, $stderr) =+ $node->psql("postgres", "SELECT pg_prewarm('test_part', 'buffer');");+ok( $stderr =~ /relation "test_part" does not have storage/,+ 'detected storage does not exist');+
# test autoprewarm_dump_now()
$result = $node->safe_psql("postgres", "SELECT autoprewarm_dump_now();");
like($result, qr/^[1-9][0-9]*$/, 'autoprewarm_dump_now succeeded');
--
2.34.1
v2-0002-Fix-error-message-details-for-partitioned-indexes.patch (text/x-diff, 1.8K) download
From 83f92645ff1f934e7960534c32ad2d67b2f0b910 Mon Sep 17 00:00:00 2001
From: Masahiro Ikeda <ikedamsh@oss.nttdata.com>
Date: Fri, 16 May 2025 14:41:27 +0900
Subject: [PATCH v2 2/2] Fix error message details for partitioned indexes in
amcheck
Until now, the error detail could be misleading when bt_index_check()
is run on partitioned indexes. For example, the index
"pgbench_accounts_pkey" is both a btree and a partitioned index.
Before this change, the error message was:
> ERROR: expected "btree" index as targets for verification
> DETAIL: Relation "pgbench_accounts_pkey" is a btree index.
This change adds the word "partitioned" to the error detail to avoid
confusion about why the error occurred.
After this change, the error message becomes:
> ERROR: expected "btree" index as targets for verification
> DETAIL: Relation "pgbench_accounts_pkey" is a btree partitioned index.
---
contrib/amcheck/verify_common.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/contrib/amcheck/verify_common.c b/contrib/amcheck/verify_common.cindex d095e62ce55..b68ddaf895d 100644--- a/contrib/amcheck/verify_common.c+++ b/contrib/amcheck/verify_common.c@@ -169,8 +169,9 @@ index_checkable(Relation rel, Oid am_id)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("expected \"%s\" index as targets for verification", NameStr(((Form_pg_am) GETSTRUCT(amtup))->amname)),
- errdetail("Relation \"%s\" is a %s index.",- RelationGetRelationName(rel), NameStr(((Form_pg_am) GETSTRUCT(amtuprel))->amname))));+ errdetail("Relation \"%s\" is a %s %sindex.",+ RelationGetRelationName(rel), NameStr(((Form_pg_am) GETSTRUCT(amtuprel))->amname),+ (rel->rd_rel->relkind == RELKIND_PARTITIONED_INDEX) ? "partitioned " : "")));
}
if (RELATION_IS_OTHER_TEMP(rel))
--
2.34.1
test_result.txt (text/plain, 20.9K) download
CREATE EXTENSION IF NOT EXISTS pg_prewarm;
psql:test.sql:7: NOTICE: extension "pg_prewarm" already exists, skipping
CREATE EXTENSION
SELECT pg_prewarm('pgbench_accounts');
psql:test.sql:9: ERROR: relation "pgbench_accounts" does not have storage
DETAIL: This operation is not supported for partitioned tables.
SELECT pg_prewarm('pgbench_accounts_1');
pg_prewarm
------------
580
(1 row)
SELECT pg_prewarm('pgbench_accounts_pkey');
psql:test.sql:11: ERROR: relation "pgbench_accounts_pkey" does not have storage
DETAIL: This operation is not supported for partitioned indexes.
SELECT pg_prewarm('pgbench_accounts_1_pkey');
pg_prewarm
------------
94
(1 row)
CREATE EXTENSION IF NOT EXISTS amcheck;
psql:test.sql:15: NOTICE: extension "amcheck" already exists, skipping
CREATE EXTENSION
SELECT bt_index_check('pgbench_accounts'::regclass, true, true);
psql:test.sql:16: ERROR: "pgbench_accounts" is not an index
SELECT bt_index_check('pgbench_accounts_1'::regclass, true, true);
psql:test.sql:17: ERROR: "pgbench_accounts_1" is not an index
SELECT bt_index_check('pgbench_accounts_pkey'::regclass, true, true);
psql:test.sql:18: ERROR: expected "btree" index as targets for verification
DETAIL: Relation "pgbench_accounts_pkey" is a btree index.
SELECT bt_index_check('pgbench_accounts_1_pkey'::regclass, true, true);
bt_index_check
----------------
(1 row)
SELECT bt_index_parent_check('pgbench_accounts'::regclass, true, true);
psql:test.sql:21: ERROR: "pgbench_accounts" is not an index
SELECT bt_index_parent_check('pgbench_accounts_1'::regclass, true, true);
psql:test.sql:22: ERROR: "pgbench_accounts_1" is not an index
SELECT bt_index_parent_check('pgbench_accounts_pkey'::regclass, true, true);
psql:test.sql:23: ERROR: expected "btree" index as targets for verification
DETAIL: Relation "pgbench_accounts_pkey" is a btree index.
SELECT bt_index_parent_check('pgbench_accounts_1_pkey'::regclass, true, true);
bt_index_parent_check
-----------------------
(1 row)
SELECT gin_index_check('pgbench_accounts'::regclass);
psql:test.sql:26: ERROR: "pgbench_accounts" is not an index
SELECT gin_index_check('pgbench_accounts_1'::regclass);
psql:test.sql:27: ERROR: "pgbench_accounts_1" is not an index
SELECT gin_index_check('pgbench_accounts_pkey'::regclass);
psql:test.sql:28: ERROR: expected "gin" index as targets for verification
DETAIL: Relation "pgbench_accounts_pkey" is a btree index.
SELECT gin_index_check('pgbench_accounts_1_pkey'::regclass);
psql:test.sql:29: ERROR: expected "gin" index as targets for verification
DETAIL: Relation "pgbench_accounts_1_pkey" is a btree index.
SELECT verify_heapam('pgbench_accounts'::regclass);
psql:test.sql:31: ERROR: cannot check relation "pgbench_accounts"
DETAIL: This operation is not supported for partitioned tables.
SELECT verify_heapam('pgbench_accounts_1'::regclass);
verify_heapam
---------------
(0 rows)
SELECT verify_heapam('pgbench_accounts_pkey'::regclass);
psql:test.sql:33: ERROR: cannot check relation "pgbench_accounts_pkey"
DETAIL: This operation is not supported for partitioned indexes.
SELECT verify_heapam('pgbench_accounts_1_pkey'::regclass);
psql:test.sql:34: ERROR: cannot check relation "pgbench_accounts_1_pkey"
DETAIL: This operation is not supported for indexes.
SELECT brin_summarize_new_values('pgbench_accounts'::regclass);
psql:test.sql:37: ERROR: "pgbench_accounts" is not an index
SELECT brin_summarize_new_values('pgbench_accounts_1'::regclass);
psql:test.sql:38: ERROR: "pgbench_accounts_1" is not an index
SELECT brin_summarize_new_values('pgbench_accounts_pkey'::regclass);
psql:test.sql:39: ERROR: "pgbench_accounts_pkey" is not a BRIN index
SELECT brin_summarize_new_values('pgbench_accounts_1_pkey'::regclass);
psql:test.sql:40: ERROR: "pgbench_accounts_1_pkey" is not a BRIN index
SELECT brin_summarize_range('pgbench_accounts'::regclass, 1);
psql:test.sql:42: ERROR: "pgbench_accounts" is not an index
SELECT brin_summarize_range('pgbench_accounts_1'::regclass, 1);
psql:test.sql:43: ERROR: "pgbench_accounts_1" is not an index
SELECT brin_summarize_range('pgbench_accounts_pkey'::regclass, 1);
psql:test.sql:44: ERROR: "pgbench_accounts_pkey" is not a BRIN index
SELECT brin_summarize_range('pgbench_accounts_1_pkey'::regclass, 1);
psql:test.sql:45: ERROR: "pgbench_accounts_1_pkey" is not a BRIN index
SELECT brin_desummarize_range('pgbench_accounts'::regclass, 1);
psql:test.sql:47: ERROR: "pgbench_accounts" is not an index
SELECT brin_desummarize_range('pgbench_accounts_1'::regclass, 1);
psql:test.sql:48: ERROR: "pgbench_accounts_1" is not an index
SELECT brin_desummarize_range('pgbench_accounts_pkey'::regclass, 1);
psql:test.sql:49: ERROR: "pgbench_accounts_pkey" is not a BRIN index
SELECT brin_desummarize_range('pgbench_accounts_1_pkey'::regclass, 1);
psql:test.sql:50: ERROR: "pgbench_accounts_1_pkey" is not a BRIN index
CREATE EXTENSION IF NOT EXISTS pageinspect;
psql:test.sql:53: NOTICE: extension "pageinspect" already exists, skipping
CREATE EXTENSION
SELECT tuple_data_split(
'pgbench_accounts'::regclass,
t_data, t_infomask, t_infomask2, t_bits
)
FROM heap_page_items(get_raw_page('pgbench_accounts_1', 2)) LIMIT 1;
psql:test.sql:59: ERROR: only heap AM is supported
SELECT tuple_data_split(
'pgbench_accounts_1'::regclass,
t_data, t_infomask, t_infomask2, t_bits
)
FROM heap_page_items(get_raw_page('pgbench_accounts_1', 2)) LIMIT 1;
tuple_data_split
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{"\\x7b000000","\\x01000000","\\x00000000","\\xab202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020"}
(1 row)
SELECT tuple_data_split(
'pgbench_accounts_pkey'::regclass,
t_data, t_infomask, t_infomask2, t_bits
)
FROM heap_page_items(get_raw_page('pgbench_accounts_1', 2)) LIMIT 1;
psql:test.sql:69: ERROR: only heap AM is supported
SELECT tuple_data_split(
'pgbench_accounts_1_pkey'::regclass,
t_data, t_infomask, t_infomask2, t_bits
)
FROM heap_page_items(get_raw_page('pgbench_accounts_1', 2)) LIMIT 1;
psql:test.sql:74: ERROR: only heap AM is supported
SELECT * FROM heap_page_item_attrs(
get_raw_page('pgbench_accounts', 0),
'pgbench_accounts'::regclass
) LIMIT 1;
psql:test.sql:79: ERROR: cannot get raw page from relation "pgbench_accounts"
DETAIL: This operation is not supported for partitioned tables.
SELECT * FROM heap_page_item_attrs(
get_raw_page('pgbench_accounts_1', 0),
'pgbench_accounts_1'::regclass
) LIMIT 1;
lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff | t_bits | t_oid | t_attrs
----+--------+----------+--------+--------+--------+----------+--------+-------------+------------+--------+--------+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 | 8064 | 1 | 121 | 766 | 0 | 8 | (0,1) | 4 | 2306 | 24 | | | {"\\x01000000","\\x01000000","\\x00000000","\\xab202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020"}
(1 row)
SELECT * FROM heap_page_item_attrs(
get_raw_page('pgbench_accounts_pkey', 0),
'pgbench_accounts_pkey'::regclass
) LIMIT 1;
psql:test.sql:87: ERROR: cannot get raw page from relation "pgbench_accounts_pkey"
DETAIL: This operation is not supported for partitioned indexes.
SELECT * FROM heap_page_item_attrs(
get_raw_page('pgbench_accounts_1_pkey', 0),
'pgbench_accounts_1_pkey'::regclass
) LIMIT 1;
lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff | t_bits | t_oid | t_attrs
----+--------+----------+--------+--------+--------+----------+--------+-------------+------------+--------+--------+-------+---------
1 | 12642 | 2 | 2 | | | | | | | | | |
(1 row)
SELECT * FROM gist_page_items(
get_raw_page('pgbench_accounts', 1),
'pgbench_accounts'::regclass
);
psql:test.sql:96: ERROR: cannot get raw page from relation "pgbench_accounts"
DETAIL: This operation is not supported for partitioned tables.
SELECT * FROM gist_page_items(
get_raw_page('pgbench_accounts_1', 1),
'pgbench_accounts_1'::regclass
);
psql:test.sql:100: ERROR: "pgbench_accounts_1" is not an index
SELECT * FROM gist_page_items(
get_raw_page('pgbench_accounts_pkey', 1),
'pgbench_accounts_pkey'::regclass
);
psql:test.sql:104: ERROR: cannot get raw page from relation "pgbench_accounts_pkey"
DETAIL: This operation is not supported for partitioned indexes.
SELECT * FROM gist_page_items(
get_raw_page('pgbench_accounts_1_pkey', 1),
'pgbench_accounts_1_pkey'::regclass
);
psql:test.sql:108: ERROR: "pgbench_accounts_1_pkey" is not a GiST index
CREATE EXTENSION IF NOT EXISTS pgstattuple;
psql:test.sql:111: NOTICE: extension "pgstattuple" already exists, skipping
CREATE EXTENSION
SELECT * FROM pgstattuple('pgbench_accounts');
psql:test.sql:113: ERROR: cannot get tuple-level statistics for relation "pgbench_accounts"
DETAIL: This operation is not supported for partitioned tables.
SELECT * FROM pgstattuple('pgbench_accounts_1');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
4751360 | 33334 | 4033414 | 84.89 | 0 | 0 | 0 | 67808 | 1.43
(1 row)
SELECT * FROM pgstattuple('pgbench_accounts_pkey');
psql:test.sql:115: ERROR: cannot get tuple-level statistics for relation "pgbench_accounts_pkey"
DETAIL: This operation is not supported for partitioned indexes.
SELECT * FROM pgstattuple('pgbench_accounts_1_pkey');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
770048 | 33334 | 533344 | 69.26 | 0 | 0 | 0 | 81484 | 10.58
(1 row)
SELECT * FROM pgstatindex('pgbench_accounts_pkey');
psql:test.sql:118: ERROR: relation "pgbench_accounts_pkey" is not a btree index
SELECT * FROM pgstatindex('pgbench_accounts_1_pkey');
version | tree_level | index_size | root_block_no | internal_pages | leaf_pages | empty_pages | deleted_pages | avg_leaf_density | leaf_fragmentation
---------+------------+------------+---------------+----------------+------------+-------------+---------------+------------------+--------------------
4 | 1 | 770048 | 3 | 1 | 92 | 0 | 0 | 89.14 | 0
(1 row)
SELECT * FROM pgstatindex('pgbench_accounts');
psql:test.sql:120: ERROR: relation "pgbench_accounts" is not a btree index
SELECT * FROM pgstatindex('pgbench_accounts_1');
psql:test.sql:121: ERROR: relation "pgbench_accounts_1" is not a btree index
SELECT * FROM pgstatginindex('pgbench_accounts_pkey');
psql:test.sql:123: ERROR: relation "pgbench_accounts_pkey" is not a GIN index
SELECT * FROM pgstatginindex('pgbench_accounts_1_pkey');
psql:test.sql:124: ERROR: relation "pgbench_accounts_1_pkey" is not a GIN index
SELECT * FROM pgstatginindex('pgbench_accounts');
psql:test.sql:125: ERROR: relation "pgbench_accounts" is not a GIN index
SELECT * FROM pgstatginindex('pgbench_accounts_1');
psql:test.sql:126: ERROR: relation "pgbench_accounts_1" is not a GIN index
SELECT * FROM pgstathashindex('pgbench_accounts_pkey');
psql:test.sql:128: ERROR: relation "pgbench_accounts_pkey" is not a hash index
SELECT * FROM pgstathashindex('pgbench_accounts_1_pkey');
psql:test.sql:129: ERROR: relation "pgbench_accounts_1_pkey" is not a hash index
SELECT * FROM pgstathashindex('pgbench_accounts');
psql:test.sql:130: ERROR: relation "pgbench_accounts" is not a hash index
SELECT * FROM pgstathashindex('pgbench_accounts_1');
psql:test.sql:131: ERROR: relation "pgbench_accounts_1" is not a hash index
SELECT pg_relpages('pgbench_accounts');
psql:test.sql:133: ERROR: cannot get page count of relation "pgbench_accounts"
DETAIL: This operation is not supported for partitioned tables.
SELECT pg_relpages('pgbench_accounts_1');
pg_relpages
-------------
580
(1 row)
SELECT pg_relpages('pgbench_accounts_pkey');
psql:test.sql:135: ERROR: cannot get page count of relation "pgbench_accounts_pkey"
DETAIL: This operation is not supported for partitioned indexes.
SELECT pg_relpages('pgbench_accounts_1_pkey');
pg_relpages
-------------
94
(1 row)
SELECT * FROM pgstattuple_approx('pgbench_accounts');
psql:test.sql:138: ERROR: relation "pgbench_accounts" is of wrong relation kind
DETAIL: This operation is not supported for partitioned tables.
SELECT * FROM pgstattuple_approx('pgbench_accounts_1');
table_len | scanned_percent | approx_tuple_count | approx_tuple_len | approx_tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | approx_free_space | approx_free_percent
-----------+-------------------+--------------------+------------------+----------------------+------------------+----------------+--------------------+-------------------+---------------------
4751360 | 5.689655172413793 | 31437 | 4424160 | 93.11355064655173 | 0 | 0 | 0 | 56864 | 1.1967941810344827
(1 row)
SELECT * FROM pgstattuple_approx('pgbench_accounts_pkey');
psql:test.sql:140: ERROR: relation "pgbench_accounts_pkey" is of wrong relation kind
DETAIL: This operation is not supported for partitioned indexes.
SELECT * FROM pgstattuple_approx('pgbench_accounts_1_pkey');
psql:test.sql:141: ERROR: relation "pgbench_accounts_1_pkey" is of wrong relation kind
DETAIL: This operation is not supported for indexes.
CREATE EXTENSION IF NOT EXISTS pg_surgery;
psql:test.sql:144: NOTICE: extension "pg_surgery" already exists, skipping
CREATE EXTENSION
SELECT heap_force_kill('pgbench_accounts', ARRAY['(0, 1)']::tid[]);
psql:test.sql:145: ERROR: cannot operate on relation "pgbench_accounts"
DETAIL: This operation is not supported for partitioned tables.
SELECT heap_force_kill('pgbench_accounts_1', ARRAY['(0, 1)']::tid[]);
heap_force_kill
-----------------
(1 row)
SELECT heap_force_kill('pgbench_accounts_pkey', ARRAY['(0, 1)']::tid[]);
psql:test.sql:147: ERROR: cannot operate on relation "pgbench_accounts_pkey"
DETAIL: This operation is not supported for partitioned indexes.
SELECT heap_force_kill('pgbench_accounts_1_pkey', ARRAY['(0, 1)']::tid[]);
psql:test.sql:148: ERROR: cannot operate on relation "pgbench_accounts_1_pkey"
DETAIL: This operation is not supported for indexes.
SELECT heap_force_freeze('pgbench_accounts', ARRAY['(0, 1)']::tid[]);
psql:test.sql:150: ERROR: cannot operate on relation "pgbench_accounts"
DETAIL: This operation is not supported for partitioned tables.
SELECT heap_force_freeze('pgbench_accounts_1', ARRAY['(0, 1)']::tid[]);
psql:test.sql:151: NOTICE: skipping tid (0, 1) for relation "pgbench_accounts_1" because it is marked dead
heap_force_freeze
-------------------
(1 row)
SELECT heap_force_freeze('pgbench_accounts_pkey', ARRAY['(0, 1)']::tid[]);
psql:test.sql:152: ERROR: cannot operate on relation "pgbench_accounts_pkey"
DETAIL: This operation is not supported for partitioned indexes.
SELECT heap_force_freeze('pgbench_accounts_1_pkey', ARRAY['(0, 1)']::tid[]);
psql:test.sql:153: ERROR: cannot operate on relation "pgbench_accounts_1_pkey"
DETAIL: This operation is not supported for indexes.
CREATE EXTENSION IF NOT EXISTS pg_visibility;
psql:test.sql:156: NOTICE: extension "pg_visibility" already exists, skipping
CREATE EXTENSION
SELECT * FROM pg_visibility_map('pgbench_accounts') LIMIT 1;
psql:test.sql:158: ERROR: relation "pgbench_accounts" is of wrong relation kind
DETAIL: This operation is not supported for partitioned tables.
SELECT * FROM pg_visibility_map('pgbench_accounts_1') LIMIT 1;
blkno | all_visible | all_frozen
-------+-------------+------------
0 | f | f
(1 row)
SELECT * FROM pg_visibility_map('pgbench_accounts_pkey') LIMIT 1;
psql:test.sql:160: ERROR: relation "pgbench_accounts_pkey" is of wrong relation kind
DETAIL: This operation is not supported for partitioned indexes.
SELECT * FROM pg_visibility_map('pgbench_accounts_1_pkey') LIMIT 1;
psql:test.sql:161: ERROR: relation "pgbench_accounts_1_pkey" is of wrong relation kind
DETAIL: This operation is not supported for indexes.
SELECT * FROM pg_visibility('pgbench_accounts') LIMIT 1;
psql:test.sql:163: ERROR: relation "pgbench_accounts" is of wrong relation kind
DETAIL: This operation is not supported for partitioned tables.
SELECT * FROM pg_visibility('pgbench_accounts_1') LIMIT 1;
blkno | all_visible | all_frozen | pd_all_visible
-------+-------------+------------+----------------
0 | f | f | f
(1 row)
SELECT * FROM pg_visibility('pgbench_accounts_pkey') LIMIT 1;
psql:test.sql:165: ERROR: relation "pgbench_accounts_pkey" is of wrong relation kind
DETAIL: This operation is not supported for partitioned indexes.
SELECT * FROM pg_visibility('pgbench_accounts_1_pkey') LIMIT 1;
psql:test.sql:166: ERROR: relation "pgbench_accounts_1_pkey" is of wrong relation kind
DETAIL: This operation is not supported for indexes.
SELECT * FROM pg_visibility_map_summary('pgbench_accounts');
psql:test.sql:168: ERROR: relation "pgbench_accounts" is of wrong relation kind
DETAIL: This operation is not supported for partitioned tables.
SELECT * FROM pg_visibility_map_summary('pgbench_accounts_1');
all_visible | all_frozen
-------------+------------
546 | 0
(1 row)
SELECT * FROM pg_visibility_map_summary('pgbench_accounts_pkey');
psql:test.sql:170: ERROR: relation "pgbench_accounts_pkey" is of wrong relation kind
DETAIL: This operation is not supported for partitioned indexes.
SELECT * FROM pg_visibility_map_summary('pgbench_accounts_1_pkey');
psql:test.sql:171: ERROR: relation "pgbench_accounts_1_pkey" is of wrong relation kind
DETAIL: This operation is not supported for indexes.
SELECT * FROM pg_check_frozen('pgbench_accounts');
psql:test.sql:173: ERROR: relation "pgbench_accounts" is of wrong relation kind
DETAIL: This operation is not supported for partitioned tables.
SELECT * FROM pg_check_frozen('pgbench_accounts_1');
t_ctid
--------
(0 rows)
SELECT * FROM pg_check_frozen('pgbench_accounts_pkey');
psql:test.sql:175: ERROR: relation "pgbench_accounts_pkey" is of wrong relation kind
DETAIL: This operation is not supported for partitioned indexes.
SELECT * FROM pg_check_frozen('pgbench_accounts_1_pkey');
psql:test.sql:176: ERROR: relation "pgbench_accounts_1_pkey" is of wrong relation kind
DETAIL: This operation is not supported for indexes.
SELECT * FROM pg_check_visible('pgbench_accounts');
psql:test.sql:178: ERROR: relation "pgbench_accounts" is of wrong relation kind
DETAIL: This operation is not supported for partitioned tables.
SELECT * FROM pg_check_visible('pgbench_accounts_1');
t_ctid
--------
(0 rows)
SELECT * FROM pg_check_visible('pgbench_accounts_pkey');
psql:test.sql:180: ERROR: relation "pgbench_accounts_pkey" is of wrong relation kind
DETAIL: This operation is not supported for partitioned indexes.
SELECT * FROM pg_check_visible('pgbench_accounts_1_pkey');
psql:test.sql:181: ERROR: relation "pgbench_accounts_1_pkey" is of wrong relation kind
DETAIL: This operation is not supported for indexes.
SELECT pg_truncate_visibility_map('pgbench_accounts');
psql:test.sql:183: ERROR: relation "pgbench_accounts" is of wrong relation kind
DETAIL: This operation is not supported for partitioned tables.
SELECT pg_truncate_visibility_map('pgbench_accounts_1');
pg_truncate_visibility_map
----------------------------
(1 row)
SELECT pg_truncate_visibility_map('pgbench_accounts_pkey');
psql:test.sql:185: ERROR: relation "pgbench_accounts_pkey" is of wrong relation kind
DETAIL: This operation is not supported for partitioned indexes.
SELECT pg_truncate_visibility_map('pgbench_accounts_1_pkey');
psql:test.sql:186: ERROR: relation "pgbench_accounts_1_pkey" is of wrong relation kind
DETAIL: This operation is not supported for indexes.
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: ikedamsh@oss.nttdata.com, guofenglinux@gmail.com, dilipbalaut@gmail.com, masao.fujii@oss.nttdata.com, pgsql-hackers@lists.postgresql.org
Subject: Re: Assertion failure in smgr.c when using pg_prewarm with partitioned tables
In-Reply-To: <8829854bbfc8635ddecd0846bb72dfda@oss.nttdata.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox