From c7e2309f4cbee684f27ed772338d0a72c6cba47b Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Tue, 4 Feb 2020 18:27:53 +0100 Subject: [PATCH] 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[]. --- .../planner/multi_physical_planner.c | 8 +++++-- .../expected/single_hash_repartition_join.out | 22 +++++++++++++++---- .../sql/single_hash_repartition_join.sql | 10 +++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/backend/distributed/planner/multi_physical_planner.c b/src/backend/distributed/planner/multi_physical_planner.c index 61f3afc9c..94bc98a17 100644 --- a/src/backend/distributed/planner/multi_physical_planner.c +++ b/src/backend/distributed/planner/multi_physical_planner.c @@ -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, diff --git a/src/test/regress/expected/single_hash_repartition_join.out b/src/test/regress/expected/single_hash_repartition_join.out index 8df46495a..4cff51e38 100644 --- a/src/test/regress/expected/single_hash_repartition_join.out +++ b/src/test/regress/expected/single_hash_repartition_join.out @@ -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; diff --git a/src/test/regress/sql/single_hash_repartition_join.sql b/src/test/regress/sql/single_hash_repartition_join.sql index 8cfa9ab83..d18da5268 100644 --- a/src/test/regress/sql/single_hash_repartition_join.sql +++ b/src/test/regress/sql/single_hash_repartition_join.sql @@ -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;