From cbbd418af2c6216c8367a3f95a78561e26b4712b Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Mon, 4 Dec 2017 18:49:43 +0100 Subject: [PATCH] Add citus.copy_format OIDs to metadata cache --- .../distributed/utils/metadata_cache.c | 53 ++++++++++++++++--- src/include/distributed/metadata_cache.h | 5 +- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/backend/distributed/utils/metadata_cache.c b/src/backend/distributed/utils/metadata_cache.c index a2546cddb..055d8ff1d 100644 --- a/src/backend/distributed/utils/metadata_cache.c +++ b/src/backend/distributed/utils/metadata_cache.c @@ -122,6 +122,8 @@ typedef struct MetadataCacheData Oid extraDataContainerFuncId; Oid workerHashFunctionId; Oid extensionOwner; + Oid binaryCopyFormatId; + Oid textCopyFormatId; Oid primaryNodeRoleId; Oid secondaryNodeRoleId; Oid unavailableNodeRoleId; @@ -197,6 +199,7 @@ static void CachedRelationLookup(const char *relationName, Oid *cachedOid); static ShardPlacement * ResolveGroupShardPlacement( GroupShardPlacement *groupShardPlacement, ShardCacheEntry *shardEntry); static WorkerNode * LookupNodeForGroup(uint32 groupid); +static Oid LookupEnumValueId(Oid typeId, char *valueName); /* exports for SQL callable functions */ @@ -1872,6 +1875,34 @@ CitusCopyFormatTypeId(void) } +/* return oid of the 'binary' citus_copy_format enum value */ +Oid +BinaryCopyFormatId(void) +{ + if (MetadataCache.binaryCopyFormatId == InvalidOid) + { + Oid copyFormatTypeId = CitusCopyFormatTypeId(); + MetadataCache.binaryCopyFormatId = LookupEnumValueId(copyFormatTypeId, "binary"); + } + + return MetadataCache.binaryCopyFormatId; +} + + +/* return oid of the 'text' citus_copy_format enum value */ +Oid +TextCopyFormatId(void) +{ + if (MetadataCache.textCopyFormatId == InvalidOid) + { + Oid copyFormatTypeId = CitusCopyFormatTypeId(); + MetadataCache.textCopyFormatId = LookupEnumValueId(copyFormatTypeId, "text"); + } + + return MetadataCache.textCopyFormatId; +} + + /* return oid of the citus_extradata_container(internal) function */ Oid CitusExtraDataContainerFuncId(void) @@ -2040,17 +2071,27 @@ LookupNodeRoleValueId(char *valueName) } else { - Datum nodeRoleIdDatum = ObjectIdGetDatum(nodeRoleTypId); - Datum valueDatum = CStringGetDatum(valueName); - - Datum valueIdDatum = DirectFunctionCall2(enum_in, valueDatum, nodeRoleIdDatum); - - Oid valueId = DatumGetObjectId(valueIdDatum); + Oid valueId = LookupEnumValueId(nodeRoleTypId, valueName); return valueId; } } +/* + * LookupEnumValueId looks up the OID of an enum value. + */ +static Oid +LookupEnumValueId(Oid typeId, char *valueName) +{ + Datum typeIdDatum = ObjectIdGetDatum(typeId); + Datum valueDatum = CStringGetDatum(valueName); + Datum valueIdDatum = DirectFunctionCall2(enum_in, valueDatum, typeIdDatum); + Oid valueId = DatumGetObjectId(valueIdDatum); + + return valueId; +} + + /* return the Oid of the 'primary' nodeRole enum value */ Oid PrimaryNodeRoleId(void) diff --git a/src/include/distributed/metadata_cache.h b/src/include/distributed/metadata_cache.h index 3bd922b37..29350bbe7 100644 --- a/src/include/distributed/metadata_cache.h +++ b/src/include/distributed/metadata_cache.h @@ -131,10 +131,13 @@ extern Oid CitusReadIntermediateResultFuncId(void); extern Oid CitusExtraDataContainerFuncId(void); extern Oid CitusWorkerHashFunctionId(void); -/* nodeRole enum oids */ +/* enum oids */ extern Oid PrimaryNodeRoleId(void); extern Oid SecondaryNodeRoleId(void); extern Oid UnavailableNodeRoleId(void); +extern Oid CitusCopyFormatTypeId(void); +extern Oid TextCopyFormatId(void); +extern Oid BinaryCopyFormatId(void); /* user related functions */ extern Oid CitusExtensionOwner(void);