From b502526ef1e52a88fc160a41f14659aef5463c54 Mon Sep 17 00:00:00 2001 From: Nitish Upreti Date: Fri, 17 Jun 2022 11:53:16 -0700 Subject: [PATCH] Split points are text --- .../citus_split_shard_by_split_points.c | 5 +-- .../11.0-2.sql | 2 +- .../latest.sql | 2 +- src/backend/distributed/utils/array_type.c | 34 +++++++++++++++++++ src/include/distributed/utils/array_type.h | 1 + 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/backend/distributed/operations/citus_split_shard_by_split_points.c b/src/backend/distributed/operations/citus_split_shard_by_split_points.c index 5503d6c2b..f9aa42e12 100644 --- a/src/backend/distributed/operations/citus_split_shard_by_split_points.c +++ b/src/backend/distributed/operations/citus_split_shard_by_split_points.c @@ -10,6 +10,7 @@ */ #include "postgres.h" +#include "catalog/pg_type.h" #include "nodes/pg_list.h" #include "distributed/utils/array_type.h" #include "lib/stringinfo.h" @@ -45,10 +46,10 @@ citus_split_shard_by_split_points(PG_FUNCTION_ARGS) uint64 shardIdToSplit = DatumGetUInt64(PG_GETARG_DATUM(0)); ArrayType *splitPointsArrayObject = PG_GETARG_ARRAYTYPE_P(1); - List *shardSplitPointsList = IntegerArrayTypeToList(splitPointsArrayObject); + List *shardSplitPointsList = TextArrayTypeToIntegerList(splitPointsArrayObject, INT4OID); ArrayType *nodeIdsArrayObject = PG_GETARG_ARRAYTYPE_P(2); - List *nodeIdsForPlacementList = IntegerArrayTypeToList(nodeIdsArrayObject); + List *nodeIdsForPlacementList = TextArrayTypeToIntegerList(nodeIdsArrayObject, INT4OID); Oid shardSplitModeOid = PG_GETARG_OID(3); SplitMode shardSplitMode = LookupSplitMode(shardSplitModeOid); diff --git a/src/backend/distributed/sql/udfs/citus_split_shard_by_split_points/11.0-2.sql b/src/backend/distributed/sql/udfs/citus_split_shard_by_split_points/11.0-2.sql index eb2d38f48..ca100f04e 100644 --- a/src/backend/distributed/sql/udfs/citus_split_shard_by_split_points/11.0-2.sql +++ b/src/backend/distributed/sql/udfs/citus_split_shard_by_split_points/11.0-2.sql @@ -6,7 +6,7 @@ CREATE TYPE citus.split_mode AS ENUM ( CREATE OR REPLACE FUNCTION pg_catalog.citus_split_shard_by_split_points( shard_id bigint, - split_points integer[], + split_points text[], -- A 'nodeId' is a uint32 in CITUS [1, 4294967296] but postgres does not have unsigned type support. -- Use integer (consistent with other previously defined UDFs that take nodeId as integer) as for all practical purposes it is big enough. node_ids integer[], diff --git a/src/backend/distributed/sql/udfs/citus_split_shard_by_split_points/latest.sql b/src/backend/distributed/sql/udfs/citus_split_shard_by_split_points/latest.sql index eb2d38f48..ca100f04e 100644 --- a/src/backend/distributed/sql/udfs/citus_split_shard_by_split_points/latest.sql +++ b/src/backend/distributed/sql/udfs/citus_split_shard_by_split_points/latest.sql @@ -6,7 +6,7 @@ CREATE TYPE citus.split_mode AS ENUM ( CREATE OR REPLACE FUNCTION pg_catalog.citus_split_shard_by_split_points( shard_id bigint, - split_points integer[], + split_points text[], -- A 'nodeId' is a uint32 in CITUS [1, 4294967296] but postgres does not have unsigned type support. -- Use integer (consistent with other previously defined UDFs that take nodeId as integer) as for all practical purposes it is big enough. node_ids integer[], diff --git a/src/backend/distributed/utils/array_type.c b/src/backend/distributed/utils/array_type.c index 70f88e740..b5f6cf995 100644 --- a/src/backend/distributed/utils/array_type.c +++ b/src/backend/distributed/utils/array_type.c @@ -12,6 +12,7 @@ #include "postgres.h" #include "miscadmin.h" +#include "catalog/pg_type.h" #include "nodes/pg_list.h" #include "distributed/utils/array_type.h" #include "utils/array.h" @@ -115,3 +116,36 @@ IntegerArrayTypeToList(ArrayType *arrayObject) return list; } + +/* + * Converts Text ArrayType to Integer List. + */ +extern List * TextArrayTypeToIntegerList(ArrayType *arrayObject, Oid datumTypeId) +{ + List *list = NULL; + Datum *datumObjectArray = DeconstructArrayObject(arrayObject); + int arrayObjectCount = ArrayObjectCount(arrayObject); + + for (int index = 0; index < arrayObjectCount; index++) + { + char *intAsStr = text_to_cstring(DatumGetTextP(datumObjectArray[index])); + + switch (datumTypeId) + { + case INT2OID: + list = lappend(list, pg_strtoint16(intAsStr)); + break; + case INT4OID: + list = lappend(list, pg_strtoint32(intAsStr)); + break; + case INT8OID: + list = lappend(list, pg_strtoint64(intAsStr)); + break; + default: + ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("Unsupported datum type for array."))); + } + } + + return list; +} diff --git a/src/include/distributed/utils/array_type.h b/src/include/distributed/utils/array_type.h index 6b605cbee..9d0ccbdd4 100644 --- a/src/include/distributed/utils/array_type.h +++ b/src/include/distributed/utils/array_type.h @@ -21,5 +21,6 @@ extern int32 ArrayObjectCount(ArrayType *arrayObject); extern ArrayType * DatumArrayToArrayType(Datum *datumArray, int datumCount, Oid datumTypeId); extern List * IntegerArrayTypeToList(ArrayType *arrayObject); +extern List * TextArrayTypeToIntegerList(ArrayType *arrayObject, Oid datumTypeId); #endif /* CITUS_ARRAY_TYPE_H */