Add reverse(bytea).
authorNathan Bossart <nathan@postgresql.org>
Thu, 13 Mar 2025 16:20:53 +0000 (11:20 -0500)
committerNathan Bossart <nathan@postgresql.org>
Thu, 13 Mar 2025 16:20:53 +0000 (11:20 -0500)
This commit introduces a function for reversing the order of the
bytes in binary strings.

Bumps catversion.

Author: Aleksander Alekseev <aleksander@timescale.com>
Discussion: https://postgr.es/m/CAJ7c6TMe0QVRuNssUArbMi0bJJK32%2BzNA3at5m3osrBQ25MHuw%40mail.gmail.com

doc/src/sgml/func.sgml
src/backend/utils/adt/varlena.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.dat
src/test/regress/expected/strings.out
src/test/regress/sql/strings.sql

index 51dd8ad65719b4dd84723e02d4a9b3708c6d0b0b..1c3810e1a046e0cf999dcb0ce609d83e6414a350 100644 (file)
@@ -4660,6 +4660,23 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
        </para></entry>
       </row>
 
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>reverse</primary>
+        </indexterm>
+        <function>reverse</function> ( <type>bytea</type> )
+        <returnvalue>bytea</returnvalue>
+       </para>
+       <para>
+        Reverses the order of the bytes in the binary string.
+       </para>
+       <para>
+        <literal>reverse('\xabcd'::bytea)</literal>
+        <returnvalue>\xcdab</returnvalue>
+       </para></entry>
+      </row>
+
       <row>
        <entry role="func_table_entry"><para role="func_signature">
         <indexterm>
index cdf185ea00b5ce7768206fa0e97264ed2eaa3b6c..95631eb209941506155b5484b56e7b7f31e7361a 100644 (file)
@@ -3398,6 +3398,27 @@ byteaSetBit(PG_FUNCTION_ARGS)
    PG_RETURN_BYTEA_P(res);
 }
 
+/*
+ * Return reversed bytea
+ */
+Datum
+bytea_reverse(PG_FUNCTION_ARGS)
+{
+   bytea      *v = PG_GETARG_BYTEA_PP(0);
+   const char *p = VARDATA_ANY(v);
+   int         len = VARSIZE_ANY_EXHDR(v);
+   const char *endp = p + len;
+   bytea      *result = palloc(len + VARHDRSZ);
+   char       *dst = (char *) VARDATA(result) + len;
+
+   SET_VARSIZE(result, len + VARHDRSZ);
+
+   while (p < endp)
+       *(--dst) = *p++;
+
+   PG_RETURN_BYTEA_P(result);
+}
+
 
 /* text_name()
  * Converts a text type to a Name type.
index 2fa248e4ed4d1f7faa5f3c92a253ae189e4ad21e..d52944b1145e904b6a2bef9f7776095ac23260d1 100644 (file)
@@ -57,6 +57,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 202503111
+#define CATALOG_VERSION_NO 202503131
 
 #endif
index 42e427f8fe878e272c5b26f6e00cdf2a3dc6f1da..890822eaf79e18137914c8fb23c4b49326ff190e 100644 (file)
 { oid => '6163', descr => 'number of set bits',
   proname => 'bit_count', prorettype => 'int8', proargtypes => 'bytea',
   prosrc => 'bytea_bit_count' },
+{ oid => '8694', descr => 'reverse bytea',
+  proname => 'reverse', prorettype => 'bytea', proargtypes => 'bytea',
+  prosrc => 'bytea_reverse' },
 
 { oid => '725',
   proname => 'dist_pl', prorettype => 'float8', proargtypes => 'point line',
index f8cba9f5b24e7287a568c5ac2859739c2c2edc63..fbe7d7be71f4d9c135c4139da9270ee990b0b482 100644 (file)
@@ -236,6 +236,24 @@ SELECT E'De\\678dBeEf'::bytea;
 ERROR:  invalid input syntax for type bytea
 LINE 1: SELECT E'De\\678dBeEf'::bytea;
                ^
+SELECT reverse(''::bytea);
+ reverse 
+---------
+ \x
+(1 row)
+
+SELECT reverse('\xaa'::bytea);
+ reverse 
+---------
+ \xaa
+(1 row)
+
+SELECT reverse('\xabcd'::bytea);
+ reverse 
+---------
+ \xcdab
+(1 row)
+
 SET bytea_output TO escape;
 SELECT E'\\xDeAdBeEf'::bytea;
       bytea       
index 4deb0683d571e5191e29d9837551f11c0c4aca5a..ed054e6e99c750f4d198374ce475fb3e73085221 100644 (file)
@@ -77,6 +77,10 @@ SELECT E'De\123dBeEf'::bytea;
 SELECT E'De\\123dBeEf'::bytea;
 SELECT E'De\\678dBeEf'::bytea;
 
+SELECT reverse(''::bytea);
+SELECT reverse('\xaa'::bytea);
+SELECT reverse('\xabcd'::bytea);
+
 SET bytea_output TO escape;
 SELECT E'\\xDeAdBeEf'::bytea;
 SELECT E'\\x De Ad Be Ef '::bytea;