Issue with pgstattuple on Sequences in PostgreSQL

Started by Ayush Vatsaalmost 2 years ago7 messagesgeneral
Jump to latest
#1Ayush Vatsa
ayushvatsa1810@gmail.com

Hi PostgreSQL Community,

I was recently exploring the pgstattuple code directory and found this
piece of code:
https://github.com/postgres/postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L255-L259
.

It indicates that pgstattuple supports relations, toast tables,
materialized views, and sequences.
However, when I executed a query with a sequence, I encountered the
following error:

postgres=> CREATE SEQUENCE serial START 101;
CREATE SEQUENCE
postgres=> SELECT * FROM pgstattuple('serial');
ERROR: only heap AM is supported
postgres=>

It got stuck in this if condition -
https://github.com/postgres/postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L326-L329
How can one use pgstattuple on sequences?

Regards,
Ayush Vatsa

#2Kashif Zeeshan
kashi.zeeshan@gmail.com
In reply to: Ayush Vatsa (#1)
Re: Issue with pgstattuple on Sequences in PostgreSQL

Hi

I dont think Sequences are support, please refer to the following
documentation.

https://www.postgresql.org/docs/current/pgstattuple.html

Regards
Kashif Zeeshan

On Mon, Jun 24, 2024 at 4:09 PM Ayush Vatsa <ayushvatsa1810@gmail.com>
wrote:

Show quoted text

Hi PostgreSQL Community,

I was recently exploring the pgstattuple code directory and found this
piece of code:
https://github.com/postgres/postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L255-L259
.

It indicates that pgstattuple supports relations, toast tables,
materialized views, and sequences.
However, when I executed a query with a sequence, I encountered the
following error:

postgres=> CREATE SEQUENCE serial START 101;
CREATE SEQUENCE
postgres=> SELECT * FROM pgstattuple('serial');
ERROR: only heap AM is supported
postgres=>

It got stuck in this if condition -
https://github.com/postgres/postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L326-L329
How can one use pgstattuple on sequences?

Regards,
Ayush Vatsa

#3Ron
ronljohnsonjr@gmail.com
In reply to: Ayush Vatsa (#1)
Re: Issue with pgstattuple on Sequences in PostgreSQL

On Mon, Jun 24, 2024 at 7:09 AM Ayush Vatsa <ayushvatsa1810@gmail.com>
wrote:
[snip]

How can one use pgstattuple on sequences?

Out of curiosity... *why*?

#4David G. Johnston
david.g.johnston@gmail.com
In reply to: Ayush Vatsa (#1)
Re: Issue with pgstattuple on Sequences in PostgreSQL

On Monday, June 24, 2024, Ayush Vatsa <ayushvatsa1810@gmail.com> wrote:

I was recently exploring the pgstattuple code directory and found this
piece of code: https://github.com/postgres/postgres/blob/master/contrib/
pgstattuple/pgstattuple.c#L255-L259.

It indicates that pgstattuple supports relations, toast tables,
materialized views, and sequences.
However, when I executed a query with a sequence, I encountered the
following error:

postgres=> CREATE SEQUENCE serial START 101;
CREATE SEQUENCE
postgres=> SELECT * FROM pgstattuple('serial');
ERROR: only heap AM is supported
postgres=>

It got stuck in this if condition - https://github.com/postgres/
postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L326-L329

How can one use pgstattuple on sequences?

As-is? Doesn’t look like you can. I agree it’s a documentation bug that
this is the case with a brief explanation of why - sequences do not produce
dead tuples and do not behave like real tables aside from being able to be
selected from (i.e., no SQL update/delete command).

The code should produce an explicit error for that relkind as well.

David J.

#5Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Ayush Vatsa (#1)
Re: Issue with pgstattuple on Sequences in PostgreSQL

On 6/24/24 04:09, Ayush Vatsa wrote:

Hi PostgreSQL Community,

I was recently exploring the pgstattuple code directory and found this
piece of code:
https://github.com/postgres/postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L255-L259 <https://github.com/postgres/postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L255-L259&gt;.

It indicates that pgstattuple supports relations, toast tables,
materialized views, and sequences.
However, when I executed a query with a sequence, I encountered the
following error:

postgres=> CREATE SEQUENCE serial START 101;
CREATE SEQUENCE
postgres=> SELECT * FROM pgstattuple('serial');
ERROR:  only heap AM is supported
postgres=>

File a bug report here:

https://www.postgresql.org/account/login/?next=/account/submitbug/

It got stuck in this if condition -
https://github.com/postgres/postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L326-L329 <https://github.com/postgres/postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L326-L329&gt;
How can one use pgstattuple on sequences?

Regards,
Ayush Vatsa

--
Adrian Klaver
adrian.klaver@aklaver.com

#6Tatsuo Ishii
t-ishii@sra.co.jp
In reply to: Ayush Vatsa (#1)
Re: Issue with pgstattuple on Sequences in PostgreSQL

On Monday, June 24, 2024, Ayush Vatsa <ayushvatsa1810@gmail.com> wrote:

I was recently exploring the pgstattuple code directory and found this
piece of code: https://github.com/postgres/postgres/blob/master/contrib/
pgstattuple/pgstattuple.c#L255-L259.

It indicates that pgstattuple supports relations, toast tables,
materialized views, and sequences.
However, when I executed a query with a sequence, I encountered the
following error:

postgres=> CREATE SEQUENCE serial START 101;
CREATE SEQUENCE
postgres=> SELECT * FROM pgstattuple('serial');
ERROR: only heap AM is supported
postgres=>

It got stuck in this if condition - https://github.com/postgres/
postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L326-L329

How can one use pgstattuple on sequences?

As-is? Doesn’t look like you can.

It used to work until v11.

test=# SELECT * FROM pgstattuple('serial');
-[ RECORD 1 ]------+------
table_len | 8192
tuple_count | 1
tuple_len | 41
tuple_percent | 0.5
dead_tuple_count | 0
dead_tuple_len | 0
dead_tuple_percent | 0
free_space | 8104
free_percent | 98.93

It stopped working by this commit:

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=4b82664156c230b59607704506f5b0a32ef490a2

because pgstat_heap() rejects other than heap AM. I think the v12
release note should have explicitly mentioned that sequences are not
supported by pgstattuple any more.

I agree it’s a documentation bug that
this is the case with a brief explanation of why - sequences do not produce
dead tuples and do not behave like real tables aside from being able to be
selected from (i.e., no SQL update/delete command).

The code should produce an explicit error for that relkind as well.

If so, then the regression test should be fixed as well. Currently
there's no test case for sequences.

Best reagards,
--
Tatsuo Ishii
SRA OSS LLC
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp

#7Ayush Vatsa
ayushvatsa1810@gmail.com
In reply to: Tatsuo Ishii (#6)
Re: Issue with pgstattuple on Sequences in PostgreSQL

I agree it’s a documentation bug

Thanks for confirmation, then maybe I can start a new thread in
pgsql-hackers about this bug and I can myself create a patch for the same.

then the regression test should be fixed as well

I will add regress test for sequences as well.

We can remove *SEQUENCE* from
https://github.com/postgres/postgres/blob/master/contrib/pgstattuple/pgstattuple.c#L255-L259

as well so that users can encounter *ERRCODE_FEATURE_NOT_SUPPORTED*.

Thanks
Ayush Vatsa
SDE AWS