mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-11 15:16:54 +08:00
Added cast from half to numeric [skip ci]
This commit is contained in:
@@ -55,6 +55,9 @@ CREATE FUNCTION integer_to_half(integer, integer, boolean) RETURNS half
|
|||||||
CREATE FUNCTION numeric_to_half(numeric, integer, boolean) RETURNS half
|
CREATE FUNCTION numeric_to_half(numeric, integer, boolean) RETURNS half
|
||||||
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
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)
|
CREATE CAST (real AS half)
|
||||||
WITH FUNCTION float4_to_half(real, integer, boolean) AS IMPLICIT;
|
WITH FUNCTION float4_to_half(real, integer, boolean) AS IMPLICIT;
|
||||||
|
|
||||||
@@ -67,6 +70,9 @@ CREATE CAST (integer AS half)
|
|||||||
CREATE CAST (numeric AS half)
|
CREATE CAST (numeric AS half)
|
||||||
WITH FUNCTION numeric_to_half(numeric, integer, boolean) AS IMPLICIT;
|
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 <-> (
|
CREATE OPERATOR <-> (
|
||||||
LEFTARG = half[], RIGHTARG = half[], PROCEDURE = l2_distance,
|
LEFTARG = half[], RIGHTARG = half[], PROCEDURE = l2_distance,
|
||||||
COMMUTATOR = '<->'
|
COMMUTATOR = '<->'
|
||||||
|
|||||||
@@ -353,6 +353,9 @@ CREATE FUNCTION integer_to_half(integer, integer, boolean) RETURNS half
|
|||||||
CREATE FUNCTION numeric_to_half(numeric, integer, boolean) RETURNS half
|
CREATE FUNCTION numeric_to_half(numeric, integer, boolean) RETURNS half
|
||||||
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
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
|
-- half casts
|
||||||
|
|
||||||
CREATE CAST (real AS half)
|
CREATE CAST (real AS half)
|
||||||
@@ -367,6 +370,9 @@ CREATE CAST (integer AS half)
|
|||||||
CREATE CAST (numeric AS half)
|
CREATE CAST (numeric AS half)
|
||||||
WITH FUNCTION numeric_to_half(numeric, integer, boolean) AS IMPLICIT;
|
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
|
-- half operators
|
||||||
|
|
||||||
CREATE OPERATOR <-> (
|
CREATE OPERATOR <-> (
|
||||||
|
|||||||
14
src/half.c
14
src/half.c
@@ -426,6 +426,20 @@ numeric_to_half(PG_FUNCTION_ARGS)
|
|||||||
PG_RETURN_HALF(h);
|
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
|
* Convert float4 to half
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -58,6 +58,12 @@ SELECT '{1,2,3}'::half[];
|
|||||||
{1,2,3}
|
{1,2,3}
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT '{1,2,3}'::half[]::real[];
|
||||||
|
float4
|
||||||
|
---------
|
||||||
|
{1,2,3}
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT '65505'::integer::half;
|
SELECT '65505'::integer::half;
|
||||||
half
|
half
|
||||||
-------
|
-------
|
||||||
@@ -82,10 +88,22 @@ SELECT '1.5'::half::real;
|
|||||||
1.5
|
1.5
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT '{1.5}'::half[]::real[];
|
SELECT '1.5'::real::half;
|
||||||
float4
|
half
|
||||||
--------
|
------
|
||||||
{1.5}
|
1.5
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT '1.5'::half::numeric;
|
||||||
|
numeric
|
||||||
|
---------
|
||||||
|
1.5
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT '1.5'::numeric::half;
|
||||||
|
half
|
||||||
|
------
|
||||||
|
1.5
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT l2_distance('{0,0}'::half[], '{3,4}'::half[]);
|
SELECT l2_distance('{0,0}'::half[], '{3,4}'::half[]);
|
||||||
|
|||||||
@@ -12,13 +12,17 @@ SELECT '1.5 '::half;
|
|||||||
SELECT '1.5a'::half;
|
SELECT '1.5a'::half;
|
||||||
|
|
||||||
SELECT '{1,2,3}'::half[];
|
SELECT '{1,2,3}'::half[];
|
||||||
|
SELECT '{1,2,3}'::half[]::real[];
|
||||||
|
|
||||||
SELECT '65505'::integer::half;
|
SELECT '65505'::integer::half;
|
||||||
SELECT 'NaN'::real::half;
|
SELECT 'NaN'::real::half;
|
||||||
SELECT 'Infinity'::real::half;
|
SELECT 'Infinity'::real::half;
|
||||||
|
|
||||||
SELECT '1.5'::half::real;
|
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[], '{3,4}'::half[]);
|
||||||
SELECT l2_distance('{0,0}'::half[], '{0,1}'::half[]);
|
SELECT l2_distance('{0,0}'::half[], '{0,1}'::half[]);
|
||||||
|
|||||||
Reference in New Issue
Block a user