Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1slZaG-008hyF-2v for pgsql-hackers@arkaria.postgresql.org; Tue, 03 Sep 2024 19:53:00 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1slZaE-00Folr-BE for pgsql-hackers@arkaria.postgresql.org; Tue, 03 Sep 2024 19:52:58 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1slZaD-00Fol4-Vj for pgsql-hackers@lists.postgresql.org; Tue, 03 Sep 2024 19:52:58 +0000 Received: from mail-io1-xd2c.google.com ([2607:f8b0:4864:20::d2c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1slZaC-000093-0n for pgsql-hackers@postgresql.org; Tue, 03 Sep 2024 19:52:57 +0000 Received: by mail-io1-xd2c.google.com with SMTP id ca18e2360f4ac-82a35ea3edaso191461639f.3 for ; Tue, 03 Sep 2024 12:52:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1725393173; x=1725997973; darn=postgresql.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=JHDmghjR5pg2AU+w4ZeyANhjZE/o7xFeMCISRc1kOPw=; b=ILOGKEdGaI8HvKs45OMqQ6Ax4UN0kPsBZUuMFvlI7kh89gY404XTS6QYUW5BULUZfH 59tj3YTsCPyfK9IfWK3x7amRovwZ0cSK0oW74yg6ZKgX9Z5zYjRDGO/tSiyXjHnJpm1y jn36JzuzXVN/EROpk11sJWmlhQqRlGnxSUIU6p6f0jcRyQmt78Yulq032/Ez+fMnFHlw gADYHZG19mdlmBEIOtlDVKRRB/BgRoK/VaemyBkph3hbRo7bOWJsK3s3Y14Y3c1nUS+p tlWjbfiz6+mNLPOle0h6Mtn/tXbDEVJR1uvv5XnJRnEMlt2aw+Cu+6UT7E1sC0E+wuvH O7Vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725393173; x=1725997973; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=JHDmghjR5pg2AU+w4ZeyANhjZE/o7xFeMCISRc1kOPw=; b=p9fQK23SUNeIob1ap4T1Zqpyp3O/z9ggSYUaoT+/95K7Hl5iN+6XT0+twp7tyeflwG j2wJxtVLzrdWJ1ccUe8KaHPCxldrTptn39g56jdL6Y+odAbuAvrzWYWw9JzmgPqqusfd 4JZxlp599Nw0optYiNrZgSwpD3vphiFJILQNduB1aBWATWLh+jFJGS9dqfkWs7emlafZ LcyiObuN009ThOumJAa2E4etoJrY3rxd48K97EcyRJNyRNCap+nnpe0oyvOnB7+5zQmu EVCqoX+34TExEg842K5QIitwWL3Ckb5y6VL3sbo6cI0qase9AmRBZ6GWn34ED3MTYQsd 4/mg== X-Forwarded-Encrypted: i=1; AJvYcCWE/Z4lh1OTu6sxlKJsjqALtfQ0vkKFJY+M76RaGgz/QUcuWGyR2H9l3d2XMQxUTvyU8fFzQeRGdpeCFYtA@postgresql.org X-Gm-Message-State: AOJu0YxxmNsllMbduREkvqD+3fI9pzVq2gxEnHP6S4xLMzbkVf6NWvmy LeFeBJydf9UsflCMBtlsCT6i2z4GTDWG6fnwJkx6nTqlkjzbCnjF X-Google-Smtp-Source: AGHT+IHvf/WyCCOexpF4gBkAshBkiweq36zOET8UTgxB7Gytx0JBr2Oxne1Mtv2NRWFcDsp8fRMeIg== X-Received: by 2002:a05:6602:342a:b0:82a:3552:6b26 with SMTP id ca18e2360f4ac-82a35526c37mr1293153439f.15.1725393173084; Tue, 03 Sep 2024 12:52:53 -0700 (PDT) Received: from nathan (162-195-168-172.lightspeed.stlsmo.sbcglobal.net. [162.195.168.172]) by smtp.gmail.com with ESMTPSA id 8926c6da1cb9f-4ced2dcdf02sm2815176173.26.2024.09.03.12.52.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Sep 2024 12:52:52 -0700 (PDT) Date: Tue, 3 Sep 2024 14:52:50 -0500 From: Nathan Bossart To: Michael Paquier Cc: Robert Haas , Ayush Vatsa , PostgreSQL Hackers Subject: Re: Pgstattuple on Sequences: Seeking Community Feedback on Potential Patch Message-ID: References: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="eO/ZuwaqUo8v51O9" Content-Disposition: inline In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --eO/ZuwaqUo8v51O9 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Here is roughly what I had in mind to commit, but I'm not sure there's a consensus on doing this. -- nathan --eO/ZuwaqUo8v51O9 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="v3-0001-Reintroduce-support-for-sequences-in-pgstattuple-.patch" From 97e670e2e0b53a9dc91c5932ccb34bb1fd7eae6b Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Tue, 3 Sep 2024 14:49:24 -0500 Subject: [PATCH v3 1/1] Reintroduce support for sequences in pgstattuple and pageinspect. Commit 4b82664156 restricted a number of functions provided by contrib modules to only relations that use the "heap" table access method. Sequences always use this table access method, but they do not advertise as such in the pg_class system catalog, so the aforementioned commit also (presumably unintentionally) removed support for sequences from these functions. This commit reintroduces said support for sequences and adds a couple of relevant tests. Co-authored-by: Ayush Vatsa Reviewed-by: FIXME Discussion: https://postgr.es/m/CACX%2BKaP3i%2Bi9tdPLjF5JCHVv93xobEdcd_eB%2B638VDvZ3i%3DcQA%40mail.gmail.com Backpatch-through: 12 --- contrib/pageinspect/expected/page.out | 9 +++++++ contrib/pageinspect/heapfuncs.c | 6 ++++- contrib/pageinspect/sql/page.sql | 5 ++++ contrib/pgstattuple/expected/pgstattuple.out | 25 ++++++++++++++++++++ contrib/pgstattuple/pgstattuple.c | 6 ++++- contrib/pgstattuple/sql/pgstattuple.sql | 12 ++++++++++ 6 files changed, 61 insertions(+), 2 deletions(-) diff --git a/contrib/pageinspect/expected/page.out b/contrib/pageinspect/expected/page.out index 80ddb45a60..04fd9dee4b 100644 --- a/contrib/pageinspect/expected/page.out +++ b/contrib/pageinspect/expected/page.out @@ -239,3 +239,12 @@ SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1); (1 row) +-- tests for sequences +create temporary sequence test_sequence; +select tuple_data_split('test_sequence'::regclass, t_data, t_infomask, t_infomask2, t_bits) + from heap_page_items(get_raw_page('test_sequence', 0)); + tuple_data_split +------------------------------------------------------- + {"\\x0100000000000000","\\x0000000000000000","\\x00"} +(1 row) + diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c index 3faeabc711..38a539dad1 100644 --- a/contrib/pageinspect/heapfuncs.c +++ b/contrib/pageinspect/heapfuncs.c @@ -320,7 +320,11 @@ tuple_data_split_internal(Oid relid, char *tupdata, raw_attrs = initArrayResult(BYTEAOID, CurrentMemoryContext, false); nattrs = tupdesc->natts; - if (rel->rd_rel->relam != HEAP_TABLE_AM_OID) + /* + * Sequences always use heap AM, but they don't show that in the catalogs. + */ + if (rel->rd_rel->relkind != RELKIND_SEQUENCE && + rel->rd_rel->relam != HEAP_TABLE_AM_OID) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("only heap AM is supported"))); diff --git a/contrib/pageinspect/sql/page.sql b/contrib/pageinspect/sql/page.sql index 5bff568d3b..59784fc7cc 100644 --- a/contrib/pageinspect/sql/page.sql +++ b/contrib/pageinspect/sql/page.sql @@ -98,3 +98,8 @@ SHOW block_size \gset SELECT fsm_page_contents(decode(repeat('00', :block_size), 'hex')); SELECT page_header(decode(repeat('00', :block_size), 'hex')); SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1); + +-- tests for sequences +create temporary sequence test_sequence; +select tuple_data_split('test_sequence'::regclass, t_data, t_infomask, t_infomask2, t_bits) + from heap_page_items(get_raw_page('test_sequence', 0)); diff --git a/contrib/pgstattuple/expected/pgstattuple.out b/contrib/pgstattuple/expected/pgstattuple.out index 283856e109..9176dc98b6 100644 --- a/contrib/pgstattuple/expected/pgstattuple.out +++ b/contrib/pgstattuple/expected/pgstattuple.out @@ -273,6 +273,31 @@ select pgstathashindex('test_partition_hash_idx'); (4,8,0,1,0,0,0,100) (1 row) +-- these should work for sequences +create sequence test_sequence; +select count(*) from pgstattuple('test_sequence'); + count +------- + 1 +(1 row) + +select pg_relpages('test_sequence'); + pg_relpages +------------- + 1 +(1 row) + +-- these should fail for sequences +select pgstatindex('test_sequence'); +ERROR: relation "test_sequence" is not a btree index +select pgstatginindex('test_sequence'); +ERROR: relation "test_sequence" is not a GIN index +select pgstathashindex('test_sequence'); +ERROR: relation "test_sequence" is not a hash index +select pgstattuple_approx('test_sequence'); +ERROR: relation "test_sequence" is of wrong relation kind +DETAIL: This operation is not supported for sequences. +drop sequence test_sequence; drop table test_partitioned; drop view test_view; drop foreign table test_foreign_table; diff --git a/contrib/pgstattuple/pgstattuple.c b/contrib/pgstattuple/pgstattuple.c index 3bd8b96197..1d012233cb 100644 --- a/contrib/pgstattuple/pgstattuple.c +++ b/contrib/pgstattuple/pgstattuple.c @@ -323,7 +323,11 @@ pgstat_heap(Relation rel, FunctionCallInfo fcinfo) pgstattuple_type stat = {0}; SnapshotData SnapshotDirty; - if (rel->rd_rel->relam != HEAP_TABLE_AM_OID) + /* + * Sequences always use heap AM, but they don't show that in the catalogs. + */ + if (rel->rd_rel->relkind != RELKIND_SEQUENCE && + rel->rd_rel->relam != HEAP_TABLE_AM_OID) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("only heap AM is supported"))); diff --git a/contrib/pgstattuple/sql/pgstattuple.sql b/contrib/pgstattuple/sql/pgstattuple.sql index b08c31c21b..7e72c567a0 100644 --- a/contrib/pgstattuple/sql/pgstattuple.sql +++ b/contrib/pgstattuple/sql/pgstattuple.sql @@ -119,6 +119,18 @@ create index test_partition_hash_idx on test_partition using hash (a); select pgstatindex('test_partition_idx'); select pgstathashindex('test_partition_hash_idx'); +-- these should work for sequences +create sequence test_sequence; +select count(*) from pgstattuple('test_sequence'); +select pg_relpages('test_sequence'); + +-- these should fail for sequences +select pgstatindex('test_sequence'); +select pgstatginindex('test_sequence'); +select pgstathashindex('test_sequence'); +select pgstattuple_approx('test_sequence'); + +drop sequence test_sequence; drop table test_partitioned; drop view test_view; drop foreign table test_foreign_table; -- 2.39.3 (Apple Git-146) --eO/ZuwaqUo8v51O9--