From 95eff595f0e7a23c155a3ba5a3dafcf7b77ab1a9 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Mon, 4 Dec 2023 12:38:34 -0800 Subject: [PATCH] Added cast from half to numeric [skip ci] --- sql/vector--0.5.1--0.6.0.sql | 6 ++++++ sql/vector.sql | 6 ++++++ src/half.c | 14 ++++++++++++++ test/expected/half.out | 26 ++++++++++++++++++++++---- test/sql/half.sql | 6 +++++- 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/sql/vector--0.5.1--0.6.0.sql b/sql/vector--0.5.1--0.6.0.sql index 5687c0a..3b9115e 100644 --- a/sql/vector--0.5.1--0.6.0.sql +++ b/sql/vector--0.5.1--0.6.0.sql @@ -55,6 +55,9 @@ CREATE FUNCTION integer_to_half(integer, integer, boolean) RETURNS half CREATE FUNCTION numeric_to_half(numeric, integer, boolean) RETURNS half AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION half_to_numeric(half, integer, boolean) RETURNS numeric + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; + CREATE CAST (real AS half) WITH FUNCTION float4_to_half(real, integer, boolean) AS IMPLICIT; @@ -67,6 +70,9 @@ CREATE CAST (integer AS half) CREATE CAST (numeric AS half) WITH FUNCTION numeric_to_half(numeric, integer, boolean) AS IMPLICIT; +CREATE CAST (half AS numeric) + WITH FUNCTION half_to_numeric(half, integer, boolean) AS IMPLICIT; + CREATE OPERATOR <-> ( LEFTARG = half[], RIGHTARG = half[], PROCEDURE = l2_distance, COMMUTATOR = '<->' diff --git a/sql/vector.sql b/sql/vector.sql index bdecf37..dfa1c7c 100644 --- a/sql/vector.sql +++ b/sql/vector.sql @@ -353,6 +353,9 @@ CREATE FUNCTION integer_to_half(integer, integer, boolean) RETURNS half CREATE FUNCTION numeric_to_half(numeric, integer, boolean) RETURNS half AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; +CREATE FUNCTION half_to_numeric(half, integer, boolean) RETURNS numeric + AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; + -- half casts CREATE CAST (real AS half) @@ -367,6 +370,9 @@ CREATE CAST (integer AS half) CREATE CAST (numeric AS half) WITH FUNCTION numeric_to_half(numeric, integer, boolean) AS IMPLICIT; +CREATE CAST (half AS numeric) + WITH FUNCTION half_to_numeric(half, integer, boolean) AS IMPLICIT; + -- half operators CREATE OPERATOR <-> ( diff --git a/src/half.c b/src/half.c index 3991ab0..5199eff 100644 --- a/src/half.c +++ b/src/half.c @@ -426,6 +426,20 @@ numeric_to_half(PG_FUNCTION_ARGS) PG_RETURN_HALF(h); } +/* + * Convert half to numeric + */ +PGDLLEXPORT PG_FUNCTION_INFO_V1(half_to_numeric); +Datum +half_to_numeric(PG_FUNCTION_ARGS) +{ + half h = PG_GETARG_HALF(0); + float f = HalfToFloat4(h); + Numeric num = DatumGetNumeric(DirectFunctionCall1(float4_numeric, Float4GetDatum(f))); + + PG_RETURN_NUMERIC(num); +} + /* * Convert float4 to half */ diff --git a/test/expected/half.out b/test/expected/half.out index ae1e391..95f4439 100644 --- a/test/expected/half.out +++ b/test/expected/half.out @@ -58,6 +58,12 @@ SELECT '{1,2,3}'::half[]; {1,2,3} (1 row) +SELECT '{1,2,3}'::half[]::real[]; + float4 +--------- + {1,2,3} +(1 row) + SELECT '65505'::integer::half; half ------- @@ -82,10 +88,22 @@ SELECT '1.5'::half::real; 1.5 (1 row) -SELECT '{1.5}'::half[]::real[]; - float4 --------- - {1.5} +SELECT '1.5'::real::half; + half +------ + 1.5 +(1 row) + +SELECT '1.5'::half::numeric; + numeric +--------- + 1.5 +(1 row) + +SELECT '1.5'::numeric::half; + half +------ + 1.5 (1 row) SELECT l2_distance('{0,0}'::half[], '{3,4}'::half[]); diff --git a/test/sql/half.sql b/test/sql/half.sql index 166cd23..7b01e1c 100644 --- a/test/sql/half.sql +++ b/test/sql/half.sql @@ -12,13 +12,17 @@ SELECT '1.5 '::half; SELECT '1.5a'::half; SELECT '{1,2,3}'::half[]; +SELECT '{1,2,3}'::half[]::real[]; SELECT '65505'::integer::half; SELECT 'NaN'::real::half; SELECT 'Infinity'::real::half; SELECT '1.5'::half::real; -SELECT '{1.5}'::half[]::real[]; +SELECT '1.5'::real::half; + +SELECT '1.5'::half::numeric; +SELECT '1.5'::numeric::half; SELECT l2_distance('{0,0}'::half[], '{3,4}'::half[]); SELECT l2_distance('{0,0}'::half[], '{0,1}'::half[]);