Improve single hash-repartitioning with numeric (or non-int) types

We used to treat the shard interval array that we passed as numeric[].
However, it should be int[], as the shard ranges are int[].
pull/3467/head
Onder Kalaci 2020-02-04 18:27:53 +01:00
parent 3826e81056
commit c7e2309f4c
3 changed files with 34 additions and 6 deletions

View File

@ -4278,13 +4278,17 @@ CreateMapQueryString(MapMergeJob *mapMergeJob, Task *filterTask,
ShardInterval **intervalArray = mapMergeJob->sortedShardIntervalArray;
uint32 intervalCount = mapMergeJob->partitionCount;
if (partitionType != SINGLE_HASH_PARTITION_TYPE && partitionType !=
RANGE_PARTITION_TYPE)
if (partitionType == DUAL_HASH_PARTITION_TYPE)
{
partitionColumnType = INT4OID;
partitionColumnTypeMod = get_typmodin(INT4OID);
intervalArray = GenerateSyntheticShardIntervalArray(intervalCount);
}
else if (partitionType == SINGLE_HASH_PARTITION_TYPE)
{
partitionColumnType = INT4OID;
partitionColumnTypeMod = get_typmodin(INT4OID);
}
ArrayType *splitPointObject = SplitPointObject(intervalArray, intervalCount);
StringInfo splitPointString = ArrayObjectToString(splitPointObject,

View File

@ -493,10 +493,24 @@ DETAIL: Creating dependency on merge taskId 20
ERROR: the query contains a join that requires repartitioning
HINT: Set citus.enable_repartition_joins to on to enable repartitioning
RESET client_min_messages;
CREATE TABLE test_numeric (a numeric, b numeric);
SET citus.shard_count TO 7;
SELECT create_distributed_table('test_numeric', 'a');
create_distributed_table
---------------------------------------------------------------------
(1 row)
INSERT INTO test_numeric SELECT i,i FROM generate_series(0,1000) i;
SET citus.enable_single_hash_repartition_joins TO ON;
SET citus.enable_repartition_joins TO on;
SELECT count(*) FROM test_numeric t1 JOIN test_numeric as t2 ON (t1.a = t2.b);
count
---------------------------------------------------------------------
1001
(1 row)
SET client_min_messages TO ERROR;
RESET search_path;
DROP SCHEMA single_hash_repartition CASCADE;
NOTICE: drop cascades to 3 other objects
DETAIL: drop cascades to table single_hash_repartition.single_hash_repartition_first
drop cascades to table single_hash_repartition.single_hash_repartition_second
drop cascades to table single_hash_repartition.ref_table
SET citus.enable_single_hash_repartition_joins TO OFF;

View File

@ -137,6 +137,16 @@ WHERE
RESET client_min_messages;
CREATE TABLE test_numeric (a numeric, b numeric);
SET citus.shard_count TO 7;
SELECT create_distributed_table('test_numeric', 'a');
INSERT INTO test_numeric SELECT i,i FROM generate_series(0,1000) i;
SET citus.enable_single_hash_repartition_joins TO ON;
SET citus.enable_repartition_joins TO on;
SELECT count(*) FROM test_numeric t1 JOIN test_numeric as t2 ON (t1.a = t2.b);
SET client_min_messages TO ERROR;
RESET search_path;
DROP SCHEMA single_hash_repartition CASCADE;
SET citus.enable_single_hash_repartition_joins TO OFF;