From aba4f2eff37ed2f0643311d0b6eca340b2190962 Mon Sep 17 00:00:00 2001 From: Jason Petersen Date: Thu, 20 Apr 2017 21:48:35 -0600 Subject: [PATCH] Handle sequence metadata access changes Sequences used to have a pretty weird representation: C code could read their attributes by loading the single tuple stored in their relation. Now each sequence has a corresponding tuple in pg_sequence, and there are syscache entries for each, meaning we can (and must) use syscache methods to look up attributes for sequences. --- src/backend/distributed/utils/citus_ruleutils.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/backend/distributed/utils/citus_ruleutils.c b/src/backend/distributed/utils/citus_ruleutils.c index 9f98c3624..63501a060 100644 --- a/src/backend/distributed/utils/citus_ruleutils.c +++ b/src/backend/distributed/utils/citus_ruleutils.c @@ -210,8 +210,20 @@ Form_pg_sequence pg_get_sequencedef(Oid sequenceRelationId) { Form_pg_sequence pgSequenceForm = NULL; - SysScanDesc scanDescriptor = NULL; HeapTuple heapTuple = NULL; + +#if (PG_VERSION_NUM >= 100000) + heapTuple = SearchSysCache1(SEQRELID, sequenceRelationId); + if (!HeapTupleIsValid(heapTuple)) + { + elog(ERROR, "cache lookup failed for sequence %u", sequenceRelationId); + } + + pgSequenceForm = (Form_pg_sequence) GETSTRUCT(heapTuple); + + ReleaseSysCache(heapTuple); +#else + SysScanDesc scanDescriptor = NULL; Relation sequenceRel = NULL; AclResult permissionCheck = ACLCHECK_NO_PRIV; @@ -241,6 +253,7 @@ pg_get_sequencedef(Oid sequenceRelationId) systable_endscan(scanDescriptor); heap_close(sequenceRel, AccessShareLock); +#endif return pgSequenceForm; }