mirror of https://github.com/citusdata/citus.git
Build DistTableCacheEntry->shardIntervalCompareFunction even for 0 shards.
Previously we, unnecessarily, used a the first shard's type information to to look up the comparison function. But that information is already available, so use it. That's helpful because we sometimes want to access the comparator function even if there's no shards.pull/1331/head
parent
ba93d32c8a
commit
52571c00ad
|
@ -134,8 +134,6 @@ static ShardCacheEntry * LookupShardCacheEntry(int64 shardId);
|
|||
static DistTableCacheEntry * LookupDistTableCacheEntry(Oid relationId);
|
||||
static void BuildDistTableCacheEntry(DistTableCacheEntry *cacheEntry);
|
||||
static void BuildCachedShardList(DistTableCacheEntry *cacheEntry);
|
||||
static FmgrInfo * ShardIntervalCompareFunction(ShardInterval **shardIntervalArray,
|
||||
char partitionMethod);
|
||||
static ShardInterval ** SortShardIntervalArray(ShardInterval **shardIntervalArray,
|
||||
int shardCount,
|
||||
FmgrInfo *
|
||||
|
@ -622,6 +620,10 @@ BuildCachedShardList(DistTableCacheEntry *cacheEntry)
|
|||
List *distShardTupleList = NIL;
|
||||
int shardIntervalArrayLength = 0;
|
||||
int shardIndex = 0;
|
||||
GetPartitionTypeInputInfo(cacheEntry->partitionKeyString,
|
||||
cacheEntry->partitionMethod,
|
||||
&intervalTypeId,
|
||||
&intervalTypeMod);
|
||||
|
||||
distShardTupleList = LookupDistShardTuples(cacheEntry->relationId);
|
||||
shardIntervalArrayLength = list_length(distShardTupleList);
|
||||
|
@ -631,13 +633,6 @@ BuildCachedShardList(DistTableCacheEntry *cacheEntry)
|
|||
TupleDesc distShardTupleDesc = RelationGetDescr(distShardRelation);
|
||||
ListCell *distShardTupleCell = NULL;
|
||||
int arrayIndex = 0;
|
||||
Oid intervalTypeId = InvalidOid;
|
||||
int32 intervalTypeMod = -1;
|
||||
|
||||
GetPartitionTypeInputInfo(cacheEntry->partitionKeyString,
|
||||
cacheEntry->partitionMethod,
|
||||
&intervalTypeId,
|
||||
&intervalTypeMod);
|
||||
|
||||
shardIntervalArray = MemoryContextAllocZero(CacheMemoryContext,
|
||||
shardIntervalArrayLength *
|
||||
|
@ -677,23 +672,19 @@ BuildCachedShardList(DistTableCacheEntry *cacheEntry)
|
|||
}
|
||||
|
||||
/* decide and allocate interval comparison function */
|
||||
if (cacheEntry->partitionMethod == DISTRIBUTE_BY_NONE)
|
||||
if (intervalTypeId != InvalidOid)
|
||||
{
|
||||
/* allocate the comparison function in the cache context */
|
||||
MemoryContext oldContext = MemoryContextSwitchTo(CacheMemoryContext);
|
||||
|
||||
shardIntervalCompareFunction = GetFunctionInfo(intervalTypeId, BTREE_AM_OID,
|
||||
BTORDER_PROC);
|
||||
MemoryContextSwitchTo(oldContext);
|
||||
}
|
||||
else
|
||||
{
|
||||
shardIntervalCompareFunction = NULL;
|
||||
}
|
||||
else if (shardIntervalArrayLength > 0)
|
||||
{
|
||||
MemoryContext oldContext = CurrentMemoryContext;
|
||||
|
||||
/* allocate the comparison function in the cache context */
|
||||
oldContext = MemoryContextSwitchTo(CacheMemoryContext);
|
||||
|
||||
shardIntervalCompareFunction =
|
||||
ShardIntervalCompareFunction(shardIntervalArray,
|
||||
cacheEntry->partitionMethod);
|
||||
|
||||
MemoryContextSwitchTo(oldContext);
|
||||
}
|
||||
|
||||
/* reference tables has a single shard which is not initialized */
|
||||
if (cacheEntry->partitionMethod == DISTRIBUTE_BY_NONE)
|
||||
|
@ -798,37 +789,6 @@ BuildCachedShardList(DistTableCacheEntry *cacheEntry)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* ShardIntervalCompareFunction returns the appropriate compare function for the
|
||||
* partition column type. In case of hash-partitioning, it always returns the compare
|
||||
* function for integers. Callers of this function has to ensure that shardIntervalArray
|
||||
* has at least one element.
|
||||
*/
|
||||
static FmgrInfo *
|
||||
ShardIntervalCompareFunction(ShardInterval **shardIntervalArray, char partitionMethod)
|
||||
{
|
||||
FmgrInfo *shardIntervalCompareFunction = NULL;
|
||||
Oid comparisonTypeId = InvalidOid;
|
||||
|
||||
Assert(shardIntervalArray != NULL);
|
||||
|
||||
if (partitionMethod == DISTRIBUTE_BY_HASH)
|
||||
{
|
||||
comparisonTypeId = INT4OID;
|
||||
}
|
||||
else
|
||||
{
|
||||
ShardInterval *shardInterval = shardIntervalArray[0];
|
||||
comparisonTypeId = shardInterval->valueTypeId;
|
||||
}
|
||||
|
||||
shardIntervalCompareFunction = GetFunctionInfo(comparisonTypeId, BTREE_AM_OID,
|
||||
BTORDER_PROC);
|
||||
|
||||
return shardIntervalCompareFunction;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* SortedShardIntervalArray sorts the input shardIntervalArray. Shard intervals with
|
||||
* no min/max values are placed at the end of the array.
|
||||
|
|
|
@ -49,7 +49,7 @@ typedef struct
|
|||
int shardIntervalArrayLength;
|
||||
ShardInterval **sortedShardIntervalArray;
|
||||
|
||||
FmgrInfo *shardIntervalCompareFunction; /* NULL if no shard intervals exist */
|
||||
FmgrInfo *shardIntervalCompareFunction; /* NULL if DISTRIBUTE_BY_NONE */
|
||||
FmgrInfo *hashFunction; /* NULL if table is not distributed by hash */
|
||||
|
||||
/* pg_dist_shard_placement metadata */
|
||||
|
|
Loading…
Reference in New Issue