Rename bytea_agg to string_agg and add delimiter argument
authorPeter Eisentraut <peter_e@gmx.net>
Fri, 13 Apr 2012 18:36:59 +0000 (21:36 +0300)
committerPeter Eisentraut <peter_e@gmx.net>
Fri, 13 Apr 2012 18:36:59 +0000 (21:36 +0300)
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
src/backend/utils/adt/varlena.c
src/include/catalog/catversion.h
src/include/catalog/pg_aggregate.h
src/include/catalog/pg_proc.h
src/include/utils/builtins.h
src/test/regress/expected/aggregates.out
src/test/regress/sql/aggregates.sql

index 94ef2f08044491e40f91965248f1c819587893fe..29d907ddd17a92fabdf1f288421668a0ef171354 100644 (file)
    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.
   </para>
+
+  <para>
+   See also the aggregate function <function>string_agg</function> in
+   <xref linkend="functions-aggregate">.
+  </para>
  </sect1>
 
 
@@ -10962,24 +10967,6 @@ SELECT NULLIF(value, '(none)') ...
       <entry>true if at least one input value is true, otherwise false</entry>
      </row>
 
-     <row>
-      <entry>
-       <indexterm>
-        <primary>bytea_agg</primary>
-       </indexterm>
-       <function>
-         bytea_agg(<replaceable class="parameter">expression</replaceable>)
-       </function>
-      </entry>
-      <entry>
-       <type>bytea</type>
-      </entry>
-      <entry>
-       <type>bytea</type>
-      </entry>
-      <entry>input values concatenated into a bytea</entry>
-     </row>
-
      <row>
       <entry>
        <indexterm>
@@ -11061,10 +11048,10 @@ SELECT NULLIF(value, '(none)') ...
        </function>
       </entry>
       <entry>
-       <type>text</type>, <type>text</type>
+       (<type>text</type>, <type>text</type>) or (<type>bytea</type>, <type>bytea</type>)
       </entry>
       <entry>
-       <type>text</type>
+       same as argument types
       </entry>
       <entry>input values concatenated into a string, separated by delimiter</entry>
      </row>
index 65e9af8db899db0bbdd97adac4c68e5aef1e144e..a5592d56e1104ea7491d1831d872ce1471146ad0 100644 (file)
@@ -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;
 
index e9fccbebd4ebfae824a3d2f4bedc583c421d3d98..d582015a5d55bcb89b96153ab352d43d9f79474a 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     201204053
+#define CATALOG_VERSION_NO     201204131
 
 #endif
index adda07c6c4bd4b27c634b22234157c187afd0518..461772c27b0683bdd126263f38331a8def4f700a 100644 (file)
@@ -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
index 6414b33ed3d3bcf80bbb9b3f2d7ed6e30f558a00..aa4d35072da3a7698a75b61e1aea2a04f1276bf9 100644 (file)
@@ -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 */
index 9fda7ad28ead228fa24a77d39665fc0a6f49426a..201b23ec9d78d5a4445f38825dd761ed8b9d37a1 100644 (file)
@@ -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);
 
index 2ec4eec59b3f50caf7b675f5efb50d993b6b8b70..5678f066cbf9b07f2d5bc9384e65e92906cc1e42 100644 (file)
@@ -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;
index 01c2e2d3cafc31053bb0505e21c1d22ef86afebf..d1c74720d3722cf633b9f063355360689944b1c8 100644 (file)
@@ -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;