{
#define PG_GET_SEQUENCE_DATA_COLS 3
Oid relid = PG_GETARG_OID(0);
- SeqTable elm;
Relation seqrel;
Datum values[PG_GET_SEQUENCE_DATA_COLS] = {0};
bool isnull[PG_GET_SEQUENCE_DATA_COLS] = {0};
LSNOID, -1, 0);
resultTupleDesc = BlessTupleDesc(resultTupleDesc);
- init_sequence(relid, &elm, &seqrel);
+ seqrel = try_relation_open(relid, AccessShareLock);
/*
- * Return all NULLs for sequences for which we lack privileges, other
- * sessions' temporary sequences, and unlogged sequences on standbys.
+ * Return all NULLs for missing sequences, sequences for which we lack
+ * privileges, other sessions' temporary sequences, and unlogged sequences
+ * on standbys.
*/
- if (pg_class_aclcheck(relid, GetUserId(), ACL_SELECT) == ACLCHECK_OK &&
+ if (seqrel && seqrel->rd_rel->relkind == RELKIND_SEQUENCE &&
+ pg_class_aclcheck(relid, GetUserId(), ACL_SELECT) == ACLCHECK_OK &&
!RELATION_IS_OTHER_TEMP(seqrel) &&
(RelationIsPermanent(seqrel) || !RecoveryInProgress()))
{
else
memset(isnull, true, sizeof(isnull));
- sequence_close(seqrel, NoLock);
+ if (seqrel)
+ relation_close(seqrel, AccessShareLock);
resultHeapTuple = heap_form_tuple(resultTupleDesc, values, isnull);
result = HeapTupleGetDatum(resultHeapTuple);
int64 cache; /* cache size */
int64 last_value; /* last value of sequence */
bool is_called; /* whether nextval advances before returning */
+ bool null_seqtuple; /* did pg_get_sequence_data return nulls? */
} SequenceItem;
typedef enum OidOptions
sequences[i].cycled = (strcmp(PQgetvalue(res, i, 7), "t") == 0);
sequences[i].last_value = strtoi64(PQgetvalue(res, i, 8), NULL, 10);
sequences[i].is_called = (strcmp(PQgetvalue(res, i, 9), "t") == 0);
+ sequences[i].null_seqtuple = (PQgetisnull(res, i, 8) || PQgetisnull(res, i, 9));
}
PQclear(res);
bool called;
PQExpBuffer query = createPQExpBuffer();
+ /* needn't bother if not dumping sequence data */
+ if (!fout->dopt->dumpData && !fout->dopt->sequence_data)
+ return;
+
/*
* For versions >= 18, the sequence information is gathered in the sorted
* array before any calls to dumpSequenceData(). See collectSequences()
entry = bsearch(&key, sequences, nsequences,
sizeof(SequenceItem), SequenceItemCmp);
+ if (entry->null_seqtuple)
+ pg_fatal("failed to get data for sequence \"%s\"; user may lack "
+ "SELECT privilege on the sequence or the sequence may "
+ "have been concurrently dropped",
+ tbinfo->dobj.name);
+
last = entry->last_value;
called = entry->is_called;
}