From 90179cf615593471a365fc51606226668f1cf495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Tue, 16 Jul 2019 18:43:19 +0000 Subject: [PATCH] Avoid calling hash functions with InvalidOid collation I opted to try find the correct collation as opposed to DEFAULT_COLLATION_OID --- src/backend/distributed/master/master_split_shards.c | 2 +- src/backend/distributed/utils/shardinterval_utils.c | 4 +++- src/backend/distributed/worker/worker_partition_protocol.c | 4 +++- src/include/distributed/worker_protocol.h | 1 + 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/master/master_split_shards.c b/src/backend/distributed/master/master_split_shards.c index a1e928e5d..d7cf8f328 100644 --- a/src/backend/distributed/master/master_split_shards.c +++ b/src/backend/distributed/master/master_split_shards.c @@ -84,7 +84,7 @@ worker_hash(PG_FUNCTION_ARGS) fmgr_info_copy(hashFunction, &(typeEntry->hash_proc_finfo), CurrentMemoryContext); /* calculate hash value */ - hashedValueDatum = FunctionCall1(hashFunction, valueDatum); + hashedValueDatum = FunctionCall1Coll(hashFunction, PG_GET_COLLATION(), valueDatum); PG_RETURN_INT32(hashedValueDatum); } diff --git a/src/backend/distributed/utils/shardinterval_utils.c b/src/backend/distributed/utils/shardinterval_utils.c index 048b860e9..dad5faf2c 100644 --- a/src/backend/distributed/utils/shardinterval_utils.c +++ b/src/backend/distributed/utils/shardinterval_utils.c @@ -253,7 +253,9 @@ FindShardInterval(Datum partitionColumnValue, DistTableCacheEntry *cacheEntry) if (cacheEntry->partitionMethod == DISTRIBUTE_BY_HASH) { - searchedValue = FunctionCall1(cacheEntry->hashFunction, partitionColumnValue); + searchedValue = FunctionCall1Coll(cacheEntry->hashFunction, + cacheEntry->partitionColumn->varcollid, + partitionColumnValue); } shardIndex = FindShardIntervalIndex(searchedValue, cacheEntry); diff --git a/src/backend/distributed/worker/worker_partition_protocol.c b/src/backend/distributed/worker/worker_partition_protocol.c index d8cfdb082..fdb070ac9 100644 --- a/src/backend/distributed/worker/worker_partition_protocol.c +++ b/src/backend/distributed/worker/worker_partition_protocol.c @@ -221,6 +221,7 @@ worker_hash_partition_table(PG_FUNCTION_ARGS) partitionContext->hashFunction = hashFunction; partitionContext->partitionCount = partitionCount; + partitionContext->collation = PG_GET_COLLATION(); /* we'll use binary search, we need the comparison function */ if (!partitionContext->hasUniformHashDistribution) @@ -1256,7 +1257,8 @@ HashPartitionId(Datum partitionValue, const void *context) ShardInterval **syntheticShardIntervalArray = hashPartitionContext->syntheticShardIntervalArray; FmgrInfo *comparisonFunction = hashPartitionContext->comparisonFunction; - Datum hashDatum = FunctionCall1(hashFunction, partitionValue); + Datum hashDatum = FunctionCall1Coll(hashFunction, hashPartitionContext->collation, + partitionValue); int32 hashResult = 0; uint32 hashPartitionId = 0; diff --git a/src/include/distributed/worker_protocol.h b/src/include/distributed/worker_protocol.h index a8567308d..644239352 100644 --- a/src/include/distributed/worker_protocol.h +++ b/src/include/distributed/worker_protocol.h @@ -79,6 +79,7 @@ typedef struct HashPartitionContext FmgrInfo *comparisonFunction; ShardInterval **syntheticShardIntervalArray; uint32 partitionCount; + Oid collation; bool hasUniformHashDistribution; } HashPartitionContext;