diff --git a/sql/vector--0.4.4--0.5.0.sql b/sql/vector--0.4.4--0.5.0.sql index 1521589..3fe3365 100644 --- a/sql/vector--0.4.4--0.5.0.sql +++ b/sql/vector--0.4.4--0.5.0.sql @@ -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 ); diff --git a/sql/vector.sql b/sql/vector.sql index 55f830b..91f594c 100644 --- a/sql/vector.sql +++ b/sql/vector.sql @@ -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 ); diff --git a/src/vector.c b/src/vector.c index 5cecf7e..e9a151e 100644 --- a/src/vector.c +++ b/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); -} diff --git a/test/expected/functions.out b/test/expected/functions.out index 86562b2..46bb8fe 100644 --- a/test/expected/functions.out +++ b/test/expected/functions.out @@ -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 diff --git a/test/sql/functions.sql b/test/sql/functions.sql index e1c5a42..fa29717 100644 --- a/test/sql/functions.sql +++ b/test/sql/functions.sql @@ -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;