Rename pg_sequence_read_tuple() to pg_get_sequence_data()

This commit removes log_cnt from the tuple returned by the SQL function.
This field is an internal counter that tracks when a WAL record should
be generated for a sequence, and it is reset each time the sequence is
restored or recovered.  It is not necessary to rebuild the sequence DDL
commands for pg_dump and pg_upgrade where this function is used.  The
field can still be queried with a scan of the "table" created
under-the-hood for a sequence.

Issue noticed while hacking on a feature that can rely on this new
function rather than pg_sequence_last_value(), aimed at making sequence
computation more easily pluggable.

Bump catalog version.

Reviewed-by: Nathan Bossart
Discussion: https://postgr.es/m/Zsvka3r-y2ZoXAdH@paquier.xyz
This commit is contained in:
Michael Paquier 2024-08-30 08:49:24 +09:00
parent 43f2e7634d
commit a83a944e9f
6 changed files with 22 additions and 23 deletions

View File

@ -1781,23 +1781,22 @@ pg_sequence_parameters(PG_FUNCTION_ARGS)
* without needing to individually query each sequence relation. * without needing to individually query each sequence relation.
*/ */
Datum Datum
pg_sequence_read_tuple(PG_FUNCTION_ARGS) pg_get_sequence_data(PG_FUNCTION_ARGS)
{ {
#define PG_GET_SEQUENCE_DATA_COLS 2
Oid relid = PG_GETARG_OID(0); Oid relid = PG_GETARG_OID(0);
SeqTable elm; SeqTable elm;
Relation seqrel; Relation seqrel;
Datum values[SEQ_COL_LASTCOL] = {0}; Datum values[PG_GET_SEQUENCE_DATA_COLS] = {0};
bool isnull[SEQ_COL_LASTCOL] = {0}; bool isnull[PG_GET_SEQUENCE_DATA_COLS] = {0};
TupleDesc resultTupleDesc; TupleDesc resultTupleDesc;
HeapTuple resultHeapTuple; HeapTuple resultHeapTuple;
Datum result; Datum result;
resultTupleDesc = CreateTemplateTupleDesc(SEQ_COL_LASTCOL); resultTupleDesc = CreateTemplateTupleDesc(PG_GET_SEQUENCE_DATA_COLS);
TupleDescInitEntry(resultTupleDesc, (AttrNumber) 1, "last_value", TupleDescInitEntry(resultTupleDesc, (AttrNumber) 1, "last_value",
INT8OID, -1, 0); INT8OID, -1, 0);
TupleDescInitEntry(resultTupleDesc, (AttrNumber) 2, "log_cnt", TupleDescInitEntry(resultTupleDesc, (AttrNumber) 2, "is_called",
INT8OID, -1, 0);
TupleDescInitEntry(resultTupleDesc, (AttrNumber) 3, "is_called",
BOOLOID, -1, 0); BOOLOID, -1, 0);
resultTupleDesc = BlessTupleDesc(resultTupleDesc); resultTupleDesc = BlessTupleDesc(resultTupleDesc);
@ -1818,8 +1817,7 @@ pg_sequence_read_tuple(PG_FUNCTION_ARGS)
seq = read_seq_tuple(seqrel, &buf, &seqtuple); seq = read_seq_tuple(seqrel, &buf, &seqtuple);
values[0] = Int64GetDatum(seq->last_value); values[0] = Int64GetDatum(seq->last_value);
values[1] = Int64GetDatum(seq->log_cnt); values[1] = BoolGetDatum(seq->is_called);
values[2] = BoolGetDatum(seq->is_called);
UnlockReleaseBuffer(buf); UnlockReleaseBuffer(buf);
} }
@ -1831,6 +1829,7 @@ pg_sequence_read_tuple(PG_FUNCTION_ARGS)
resultHeapTuple = heap_form_tuple(resultTupleDesc, values, isnull); resultHeapTuple = heap_form_tuple(resultTupleDesc, values, isnull);
result = HeapTupleGetDatum(resultHeapTuple); result = HeapTupleGetDatum(resultHeapTuple);
PG_RETURN_DATUM(result); PG_RETURN_DATUM(result);
#undef PG_GET_SEQUENCE_DATA_COLS
} }

View File

@ -17381,7 +17381,7 @@ collectSequences(Archive *fout)
* versions, but for now it seems unlikely to be worth it. * versions, but for now it seems unlikely to be worth it.
* *
* Since version 18, we can gather the sequence data in this query with * Since version 18, we can gather the sequence data in this query with
* pg_sequence_read_tuple(), but we only do so for non-schema-only dumps. * pg_get_sequence_data(), but we only do so for non-schema-only dumps.
*/ */
if (fout->remoteVersion < 100000) if (fout->remoteVersion < 100000)
return; return;
@ -17401,7 +17401,7 @@ collectSequences(Archive *fout)
"seqcache, seqcycle, " "seqcache, seqcycle, "
"last_value, is_called " "last_value, is_called "
"FROM pg_catalog.pg_sequence, " "FROM pg_catalog.pg_sequence, "
"pg_sequence_read_tuple(seqrelid) " "pg_get_sequence_data(seqrelid) "
"ORDER BY seqrelid;"; "ORDER BY seqrelid;";
res = ExecuteSqlQuery(fout, query, PGRES_TUPLES_OK); res = ExecuteSqlQuery(fout, query, PGRES_TUPLES_OK);

View File

@ -57,6 +57,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 202408122 #define CATALOG_VERSION_NO 202408301
#endif #endif

View File

@ -3330,11 +3330,11 @@
prorettype => 'int8', proargtypes => 'regclass', prorettype => 'int8', proargtypes => 'regclass',
prosrc => 'pg_sequence_last_value' }, prosrc => 'pg_sequence_last_value' },
{ oid => '9876', descr => 'return sequence tuple, for use by pg_dump', { oid => '9876', descr => 'return sequence tuple, for use by pg_dump',
proname => 'pg_sequence_read_tuple', provolatile => 'v', proparallel => 'u', proname => 'pg_get_sequence_data', provolatile => 'v', proparallel => 'u',
prorettype => 'record', proargtypes => 'regclass', prorettype => 'record', proargtypes => 'regclass',
proallargtypes => '{regclass,int8,int8,bool}', proargmodes => '{i,o,o,o}', proallargtypes => '{regclass,int8,bool}', proargmodes => '{i,o,o}',
proargnames => '{sequence_oid,last_value,log_cnt,is_called}', proargnames => '{sequence_oid,last_value,is_called}',
prosrc => 'pg_sequence_read_tuple' }, prosrc => 'pg_get_sequence_data' },
{ oid => '275', descr => 'return the next oid for a system table', { oid => '275', descr => 'return the next oid for a system table',
proname => 'pg_nextoid', provolatile => 'v', proparallel => 'u', proname => 'pg_nextoid', provolatile => 'v', proparallel => 'u',

View File

@ -839,11 +839,11 @@ SELECT nextval('test_seq1');
3 3
(1 row) (1 row)
-- pg_sequence_read_tuple -- pg_get_sequence_data
SELECT * FROM pg_sequence_read_tuple('test_seq1'); SELECT * FROM pg_get_sequence_data('test_seq1');
last_value | log_cnt | is_called last_value | is_called
------------+---------+----------- ------------+-----------
10 | 32 | t 10 | t
(1 row) (1 row)
DROP SEQUENCE test_seq1; DROP SEQUENCE test_seq1;

View File

@ -413,7 +413,7 @@ SELECT nextval('test_seq1');
SELECT nextval('test_seq1'); SELECT nextval('test_seq1');
SELECT nextval('test_seq1'); SELECT nextval('test_seq1');
-- pg_sequence_read_tuple -- pg_get_sequence_data
SELECT * FROM pg_sequence_read_tuple('test_seq1'); SELECT * FROM pg_get_sequence_data('test_seq1');
DROP SEQUENCE test_seq1; DROP SEQUENCE test_seq1;