From c0cc526e8b1e821dfced692a68e4c8978c2bdbc1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 13 Apr 2012 21:36:59 +0300 Subject: [PATCH] Rename bytea_agg to string_agg and add delimiter argument Per mailing list discussion, we would like to keep the bytea functions parallel to the text functions, so rename bytea_agg to string_agg, which already exists for text. Also, to satisfy the rule that we don't want aggregate functions of the same name with a different number of arguments, add a delimiter argument, just like string_agg for text already has. --- doc/src/sgml/func.sgml | 27 ++++++-------------- src/backend/utils/adt/varlena.c | 13 +++++++--- src/include/catalog/catversion.h | 2 +- src/include/catalog/pg_aggregate.h | 2 +- src/include/catalog/pg_proc.h | 6 ++--- src/include/utils/builtins.h | 4 +-- src/test/regress/expected/aggregates.out | 32 ++++++++++++++++-------- src/test/regress/sql/aggregates.sql | 10 +++++--- 8 files changed, 52 insertions(+), 44 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 94ef2f0804..29d907ddd1 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -3160,6 +3160,11 @@ right within each byte; for example bit 0 is the least significant bit of the first byte, and bit 15 is the most significant bit of the second byte. + + + See also the aggregate function string_agg in + . + @@ -10962,24 +10967,6 @@ SELECT NULLIF(value, '(none)') ... true if at least one input value is true, otherwise false - - - - bytea_agg - - - bytea_agg(expression) - - - - bytea - - - bytea - - input values concatenated into a bytea - - @@ -11061,10 +11048,10 @@ SELECT NULLIF(value, '(none)') ... - text, text + (text, text) or (bytea, bytea) - text + same as argument types input values concatenated into a string, separated by delimiter diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 65e9af8db8..a5592d56e1 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -397,7 +397,7 @@ byteasend(PG_FUNCTION_ARGS) } Datum -bytea_agg_transfn(PG_FUNCTION_ARGS) +bytea_string_agg_transfn(PG_FUNCTION_ARGS) { StringInfo state; @@ -408,21 +408,28 @@ bytea_agg_transfn(PG_FUNCTION_ARGS) { bytea *value = PG_GETARG_BYTEA_PP(1); + /* On the first time through, we ignore the delimiter. */ if (state == NULL) state = makeStringAggState(fcinfo); + else if (!PG_ARGISNULL(2)) + { + bytea *delim = PG_GETARG_BYTEA_PP(2); + + appendBinaryStringInfo(state, VARDATA_ANY(delim), VARSIZE_ANY_EXHDR(delim)); + } appendBinaryStringInfo(state, VARDATA_ANY(value), VARSIZE_ANY_EXHDR(value)); } /* - * The transition type for bytea_agg() is declared to be "internal", + * The transition type for string_agg() is declared to be "internal", * which is a pass-by-value type the same size as a pointer. */ PG_RETURN_POINTER(state); } Datum -bytea_agg_finalfn(PG_FUNCTION_ARGS) +bytea_string_agg_finalfn(PG_FUNCTION_ARGS) { StringInfo state; diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index e9fccbebd4..d582015a5d 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 201204053 +#define CATALOG_VERSION_NO 201204131 #endif diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h index adda07c6c4..461772c27b 100644 --- a/src/include/catalog/pg_aggregate.h +++ b/src/include/catalog/pg_aggregate.h @@ -229,7 +229,7 @@ DATA(insert ( 2335 array_agg_transfn array_agg_finalfn 0 2281 _null_ )); DATA(insert ( 3538 string_agg_transfn string_agg_finalfn 0 2281 _null_ )); /* bytea */ -DATA(insert ( 3545 bytea_agg_transfn bytea_agg_finalfn 0 2281 _null_ )); +DATA(insert ( 3545 bytea_string_agg_transfn bytea_string_agg_finalfn 0 2281 _null_ )); /* * prototypes for functions in pg_aggregate.c diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 6414b33ed3..aa4d35072d 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -2433,11 +2433,11 @@ DATA(insert OID = 3536 ( string_agg_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f DESCR("aggregate final function"); DATA(insert OID = 3538 ( string_agg PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ )); DESCR("concatenate aggregate input into a string"); -DATA(insert OID = 3543 ( bytea_agg_transfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 17" _null_ _null_ _null_ _null_ bytea_agg_transfn _null_ _null_ _null_ )); +DATA(insert OID = 3543 ( bytea_string_agg_transfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 2281 "2281 17 17" _null_ _null_ _null_ _null_ bytea_string_agg_transfn _null_ _null_ _null_ )); DESCR("aggregate transition function"); -DATA(insert OID = 3544 ( bytea_agg_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 17 "2281" _null_ _null_ _null_ _null_ bytea_agg_finalfn _null_ _null_ _null_ )); +DATA(insert OID = 3544 ( bytea_string_agg_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 17 "2281" _null_ _null_ _null_ _null_ bytea_string_agg_finalfn _null_ _null_ _null_ )); DESCR("aggregate final function"); -DATA(insert OID = 3545 ( bytea_agg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 17 "17" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ )); +DATA(insert OID = 3545 ( string_agg PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 17 "17 17" _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ )); DESCR("concatenate aggregate input into a bytea"); /* To ASCII conversion */ diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 9fda7ad28e..201b23ec9d 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -771,8 +771,8 @@ extern Datum unknownsend(PG_FUNCTION_ARGS); extern Datum pg_column_size(PG_FUNCTION_ARGS); -extern Datum bytea_agg_transfn(PG_FUNCTION_ARGS); -extern Datum bytea_agg_finalfn(PG_FUNCTION_ARGS); +extern Datum bytea_string_agg_transfn(PG_FUNCTION_ARGS); +extern Datum bytea_string_agg_finalfn(PG_FUNCTION_ARGS); extern Datum string_agg_transfn(PG_FUNCTION_ARGS); extern Datum string_agg_finalfn(PG_FUNCTION_ARGS); diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index 2ec4eec59b..5678f066cb 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -1061,26 +1061,38 @@ select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl; - a,ab,abcd (1 row) --- bytea_agg tests +-- string_agg bytea tests create table bytea_test_table(v bytea); -select bytea_agg(v) from bytea_test_table; - bytea_agg ------------ +select string_agg(v, '') from bytea_test_table; + string_agg +------------ (1 row) insert into bytea_test_table values(decode('ff','hex')); -select bytea_agg(v) from bytea_test_table; - bytea_agg ------------ +select string_agg(v, '') from bytea_test_table; + string_agg +------------ \xff (1 row) insert into bytea_test_table values(decode('aa','hex')); -select bytea_agg(v) from bytea_test_table; - bytea_agg ------------ +select string_agg(v, '') from bytea_test_table; + string_agg +------------ \xffaa (1 row) +select string_agg(v, NULL) from bytea_test_table; + string_agg +------------ + \xffaa +(1 row) + +select string_agg(v, decode('ee', 'hex')) from bytea_test_table; + string_agg +------------ + \xffeeaa +(1 row) + drop table bytea_test_table; diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index 01c2e2d3ca..d1c74720d3 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -417,17 +417,19 @@ select string_agg(distinct f1::text, ',' order by f1) from varchar_tbl; -- not select string_agg(distinct f1, ',' order by f1::text) from varchar_tbl; -- not ok select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl; -- ok --- bytea_agg tests +-- string_agg bytea tests create table bytea_test_table(v bytea); -select bytea_agg(v) from bytea_test_table; +select string_agg(v, '') from bytea_test_table; insert into bytea_test_table values(decode('ff','hex')); -select bytea_agg(v) from bytea_test_table; +select string_agg(v, '') from bytea_test_table; insert into bytea_test_table values(decode('aa','hex')); -select bytea_agg(v) from bytea_test_table; +select string_agg(v, '') from bytea_test_table; +select string_agg(v, NULL) from bytea_test_table; +select string_agg(v, decode('ee', 'hex')) from bytea_test_table; drop table bytea_test_table; -- GitLab