From: Peter Eisentraut Date: Sat, 6 Mar 2021 18:25:45 +0000 (+0100) Subject: Add bit_xor aggregate function X-Git-Tag: REL_14_BETA1~635 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f9a0392e1cf36179c984f655a6589734b8dd7468;p=thirdparty%2Fpostgresql.git Add bit_xor aggregate function This can be used as a checksum for unordered sets. bit_and and bit_or already exist. Author: Alexey Bashtanov Reviewed-by: Ibrar Ahmed Discussion: https://www.postgresql.org/message-id/flat/9d4582ae-ecfc-3a13-2238-6ab5a37c1f41@imap.cc --- diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index fee05619612..ece09699ef8 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -19224,6 +19224,33 @@ SELECT NULLIF(value, '(none)') ... Yes + + + + bit_xor + + bit_xor ( smallint ) + smallint + + + bit_xor ( integer ) + integer + + + bit_xor ( bigint ) + bigint + + + bit_xor ( bit ) + bit + + + Computes the bitwise exclusive OR of all non-null input values. + Can be useful as a checksum for an unordered set of values. + + Yes + + diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 28b8a32129c..8805c99d6f8 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202103032 +#define CATALOG_VERSION_NO 202103061 #endif diff --git a/src/include/catalog/pg_aggregate.dat b/src/include/catalog/pg_aggregate.dat index 5c1f9622514..0d8c5a922a3 100644 --- a/src/include/catalog/pg_aggregate.dat +++ b/src/include/catalog/pg_aggregate.dat @@ -505,18 +505,26 @@ aggcombinefn => 'int2and', aggtranstype => 'int2' }, { aggfnoid => 'bit_or(int2)', aggtransfn => 'int2or', aggcombinefn => 'int2or', aggtranstype => 'int2' }, +{ aggfnoid => 'bit_xor(int2)', aggtransfn => 'int2xor', aggcombinefn => 'int2xor', + aggtranstype => 'int2' }, { aggfnoid => 'bit_and(int4)', aggtransfn => 'int4and', aggcombinefn => 'int4and', aggtranstype => 'int4' }, { aggfnoid => 'bit_or(int4)', aggtransfn => 'int4or', aggcombinefn => 'int4or', aggtranstype => 'int4' }, +{ aggfnoid => 'bit_xor(int4)', aggtransfn => 'int4xor', aggcombinefn => 'int4xor', + aggtranstype => 'int4' }, { aggfnoid => 'bit_and(int8)', aggtransfn => 'int8and', aggcombinefn => 'int8and', aggtranstype => 'int8' }, { aggfnoid => 'bit_or(int8)', aggtransfn => 'int8or', aggcombinefn => 'int8or', aggtranstype => 'int8' }, +{ aggfnoid => 'bit_xor(int8)', aggtransfn => 'int8xor', aggcombinefn => 'int8xor', + aggtranstype => 'int8' }, { aggfnoid => 'bit_and(bit)', aggtransfn => 'bitand', aggcombinefn => 'bitand', aggtranstype => 'bit' }, { aggfnoid => 'bit_or(bit)', aggtransfn => 'bitor', aggcombinefn => 'bitor', aggtranstype => 'bit' }, +{ aggfnoid => 'bit_xor(bit)', aggtransfn => 'bitxor', aggcombinefn => 'bitxor', + aggtranstype => 'bit' }, # xml { aggfnoid => 'xmlagg', aggtransfn => 'xmlconcat2', aggtranstype => 'xml' }, diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 59d2b71ca9c..506689d8acf 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -7995,24 +7995,36 @@ { oid => '2237', descr => 'bitwise-or smallint aggregate', proname => 'bit_or', prokind => 'a', proisstrict => 'f', prorettype => 'int2', proargtypes => 'int2', prosrc => 'aggregate_dummy' }, +{ oid => '8452', descr => 'bitwise-xor smallint aggregate', + proname => 'bit_xor', prokind => 'a', proisstrict => 'f', prorettype => 'int2', + proargtypes => 'int2', prosrc => 'aggregate_dummy' }, { oid => '2238', descr => 'bitwise-and integer aggregate', proname => 'bit_and', prokind => 'a', proisstrict => 'f', prorettype => 'int4', proargtypes => 'int4', prosrc => 'aggregate_dummy' }, { oid => '2239', descr => 'bitwise-or integer aggregate', proname => 'bit_or', prokind => 'a', proisstrict => 'f', prorettype => 'int4', proargtypes => 'int4', prosrc => 'aggregate_dummy' }, +{ oid => '8453', descr => 'bitwise-xor integer aggregate', + proname => 'bit_xor', prokind => 'a', proisstrict => 'f', prorettype => 'int4', + proargtypes => 'int4', prosrc => 'aggregate_dummy' }, { oid => '2240', descr => 'bitwise-and bigint aggregate', proname => 'bit_and', prokind => 'a', proisstrict => 'f', prorettype => 'int8', proargtypes => 'int8', prosrc => 'aggregate_dummy' }, { oid => '2241', descr => 'bitwise-or bigint aggregate', proname => 'bit_or', prokind => 'a', proisstrict => 'f', prorettype => 'int8', proargtypes => 'int8', prosrc => 'aggregate_dummy' }, +{ oid => '8454', descr => 'bitwise-xor bigint aggregate', + proname => 'bit_xor', prokind => 'a', proisstrict => 'f', prorettype => 'int8', + proargtypes => 'int8', prosrc => 'aggregate_dummy' }, { oid => '2242', descr => 'bitwise-and bit aggregate', proname => 'bit_and', prokind => 'a', proisstrict => 'f', prorettype => 'bit', proargtypes => 'bit', prosrc => 'aggregate_dummy' }, { oid => '2243', descr => 'bitwise-or bit aggregate', proname => 'bit_or', prokind => 'a', proisstrict => 'f', prorettype => 'bit', proargtypes => 'bit', prosrc => 'aggregate_dummy' }, +{ oid => '8455', descr => 'bitwise-xor bit aggregate', + proname => 'bit_xor', prokind => 'a', proisstrict => 'f', prorettype => 'bit', + proargtypes => 'bit', prosrc => 'aggregate_dummy' }, # formerly-missing interval + datetime operators { oid => '2546', diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index 477fd1205c3..2c818d92534 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -742,11 +742,12 @@ CREATE TEMPORARY TABLE bitwise_test( -- empty case SELECT BIT_AND(i2) AS "?", - BIT_OR(i4) AS "?" + BIT_OR(i4) AS "?", + BIT_XOR(i8) AS "?" FROM bitwise_test; - ? | ? ----+--- - | + ? | ? | ? +---+---+--- + | | (1 row) COPY bitwise_test FROM STDIN NULL 'null'; @@ -762,11 +763,17 @@ SELECT BIT_OR(i8) AS "7", BIT_OR(i) AS "?", BIT_OR(x) AS "7", - BIT_OR(y) AS "1101" + BIT_OR(y) AS "1101", + BIT_XOR(i2) AS "5", + BIT_XOR(i4) AS "5", + BIT_XOR(i8) AS "5", + BIT_XOR(i) AS "?", + BIT_XOR(x) AS "7", + BIT_XOR(y) AS "1101" FROM bitwise_test; - 1 | 1 | 1 | ? | 0 | 0100 | 7 | 7 | 7 | ? | 7 | 1101 ----+---+---+---+---+------+---+---+---+---+---+------ - 1 | 1 | 1 | 1 | 0 | 0100 | 7 | 7 | 7 | 3 | 7 | 1101 + 1 | 1 | 1 | ? | 0 | 0100 | 7 | 7 | 7 | ? | 7 | 1101 | 5 | 5 | 5 | ? | 7 | 1101 +---+---+---+---+---+------+---+---+---+---+---+------+---+---+---+---+---+------ + 1 | 1 | 1 | 1 | 0 | 0100 | 7 | 7 | 7 | 3 | 7 | 1101 | 5 | 5 | 5 | 2 | 7 | 1101 (1 row) -- diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index 54f5cf7ecc4..f9579af19a9 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -212,7 +212,8 @@ CREATE TEMPORARY TABLE bitwise_test( -- empty case SELECT BIT_AND(i2) AS "?", - BIT_OR(i4) AS "?" + BIT_OR(i4) AS "?", + BIT_XOR(i8) AS "?" FROM bitwise_test; COPY bitwise_test FROM STDIN NULL 'null'; @@ -234,7 +235,14 @@ SELECT BIT_OR(i8) AS "7", BIT_OR(i) AS "?", BIT_OR(x) AS "7", - BIT_OR(y) AS "1101" + BIT_OR(y) AS "1101", + + BIT_XOR(i2) AS "5", + BIT_XOR(i4) AS "5", + BIT_XOR(i8) AS "5", + BIT_XOR(i) AS "?", + BIT_XOR(x) AS "7", + BIT_XOR(y) AS "1101" FROM bitwise_test; --