mirror of
https://github.com/pgvector/pgvector.git
synced 2026-06-06 05:51:21 +08:00
Simplified sum aggregate
This commit is contained in:
@@ -12,14 +12,9 @@ CREATE OPERATOR * (
|
||||
COMMUTATOR = *
|
||||
);
|
||||
|
||||
CREATE FUNCTION vector_sum(double precision[]) RETURNS vector
|
||||
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||
|
||||
CREATE AGGREGATE sum(vector) (
|
||||
SFUNC = vector_accum,
|
||||
STYPE = double precision[],
|
||||
FINALFUNC = vector_sum,
|
||||
COMBINEFUNC = vector_combine,
|
||||
INITCOND = '{0}',
|
||||
SFUNC = vector_add,
|
||||
STYPE = vector,
|
||||
COMBINEFUNC = vector_add,
|
||||
PARALLEL = SAFE
|
||||
);
|
||||
|
||||
@@ -99,9 +99,6 @@ CREATE FUNCTION vector_avg(double precision[]) RETURNS vector
|
||||
CREATE FUNCTION vector_combine(double precision[], double precision[]) RETURNS double precision[]
|
||||
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||
|
||||
CREATE FUNCTION vector_sum(double precision[]) RETURNS vector
|
||||
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||
|
||||
-- aggregates
|
||||
|
||||
CREATE AGGREGATE avg(vector) (
|
||||
@@ -114,11 +111,9 @@ CREATE AGGREGATE avg(vector) (
|
||||
);
|
||||
|
||||
CREATE AGGREGATE sum(vector) (
|
||||
SFUNC = vector_accum,
|
||||
STYPE = double precision[],
|
||||
FINALFUNC = vector_sum,
|
||||
COMBINEFUNC = vector_combine,
|
||||
INITCOND = '{0}',
|
||||
SFUNC = vector_add,
|
||||
STYPE = vector,
|
||||
COMBINEFUNC = vector_add,
|
||||
PARALLEL = SAFE
|
||||
);
|
||||
|
||||
|
||||
39
src/vector.c
39
src/vector.c
@@ -1090,42 +1090,3 @@ vector_avg(PG_FUNCTION_ARGS)
|
||||
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
/*
|
||||
* Sum vectors
|
||||
*/
|
||||
PGDLLEXPORT PG_FUNCTION_INFO_V1(vector_sum);
|
||||
Datum
|
||||
vector_sum(PG_FUNCTION_ARGS)
|
||||
{
|
||||
ArrayType *statearray = PG_GETARG_ARRAYTYPE_P(0);
|
||||
float8 *statevalues;
|
||||
float8 n;
|
||||
uint16 dim;
|
||||
Vector *result;
|
||||
|
||||
/* Check array before using */
|
||||
statevalues = CheckStateArray(statearray, "vector_sum");
|
||||
n = statevalues[0];
|
||||
|
||||
/* SQL defines AVG of no values to be NULL */
|
||||
if (n == 0.0)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* Create vector */
|
||||
dim = STATE_DIMS(statearray);
|
||||
CheckDim(dim);
|
||||
result = InitVector(dim);
|
||||
for (int i = 0; i < dim; i++)
|
||||
{
|
||||
result->x[i] = statevalues[i + 1];
|
||||
|
||||
/* Check for overflow */
|
||||
if (isinf(result->x[i]))
|
||||
float_overflow_error();
|
||||
|
||||
CheckElement(result->x[i]);
|
||||
}
|
||||
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
@@ -157,8 +157,6 @@ SELECT sum(v) FROM unnest(ARRAY[]::vector[]) v;
|
||||
(1 row)
|
||||
|
||||
SELECT sum(v) FROM unnest(ARRAY['[1,2]'::vector, '[3]']) v;
|
||||
ERROR: expected 2 dimensions, not 1
|
||||
ERROR: different vector dimensions 2 and 1
|
||||
SELECT sum(v) FROM unnest(ARRAY['[3e38]'::vector, '[3e38]']) v;
|
||||
ERROR: value out of range: overflow
|
||||
SELECT vector_sum(array_agg(n)) FROM generate_series(1, 16002) n;
|
||||
ERROR: vector cannot have more than 16000 dimensions
|
||||
|
||||
@@ -41,4 +41,3 @@ SELECT sum(v) FROM unnest(ARRAY['[1,2,3]'::vector, '[3,5,7]', NULL]) v;
|
||||
SELECT sum(v) FROM unnest(ARRAY[]::vector[]) v;
|
||||
SELECT sum(v) FROM unnest(ARRAY['[1,2]'::vector, '[3]']) v;
|
||||
SELECT sum(v) FROM unnest(ARRAY['[3e38]'::vector, '[3e38]']) v;
|
||||
SELECT vector_sum(array_agg(n)) FROM generate_series(1, 16002) n;
|
||||
|
||||
Reference in New Issue
Block a user