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:
parent
43f2e7634d
commit
a83a944e9f
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -57,6 +57,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* yyyymmddN */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 202408122
|
#define CATALOG_VERSION_NO 202408301
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -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',
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user