1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-24 14:22:24 +03:00

Add get_bit/set_bit functions for bit strings, paralleling those for bytea,

and implement OVERLAY() for bit strings and bytea.

In passing also convert text OVERLAY() to a true built-in, instead of
relying on a SQL function.

Leonardo F, reviewed by Kevin Grittner
This commit is contained in:
Tom Lane
2010-01-25 20:55:32 +00:00
parent 1d1f425f8d
commit 9507c8a1db
13 changed files with 554 additions and 93 deletions

View File

@ -1,4 +1,4 @@
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.497 2010/01/19 05:50:18 tgl Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.498 2010/01/25 20:55:32 tgl Exp $ -->
<chapter id="functions">
<title>Functions and Operators</title>
@ -2620,7 +2620,7 @@
<entry>Return Type</entry>
<entry>Description</entry>
<entry>Example</entry>
<entry>Result</entry>
<entry>Result</entry>
</row>
</thead>
@ -2640,32 +2640,6 @@
<entry><literal>\\Post'gres\000</literal></entry>
</row>
<row>
<entry><function>get_bit</function>(<parameter>string</parameter>, <parameter>offset</parameter>)</entry>
<entry><type>int</type></entry>
<entry>
Extract bit from string
<indexterm>
<primary>get_bit</primary>
</indexterm>
</entry>
<entry><literal>get_bit(E'Th\\000omas'::bytea, 45)</literal></entry>
<entry><literal>1</literal></entry>
</row>
<row>
<entry><function>get_byte</function>(<parameter>string</parameter>, <parameter>offset</parameter>)</entry>
<entry><type>int</type></entry>
<entry>
Extract byte from string
<indexterm>
<primary>get_byte</primary>
</indexterm>
</entry>
<entry><literal>get_byte(E'Th\\000omas'::bytea, 4)</literal></entry>
<entry><literal>109</literal></entry>
</row>
<row>
<entry><literal><function>octet_length</function>(<parameter>string</parameter>)</literal></entry>
<entry><type>int</type></entry>
@ -2674,6 +2648,16 @@
<entry><literal>5</literal></entry>
</row>
<row>
<entry><literal><function>overlay</function>(<parameter>string</parameter> placing <parameter>string</parameter> from <type>int</type> <optional>for <type>int</type></optional>)</literal></entry>
<entry><type>bytea</type></entry>
<entry>
Replace substring
</entry>
<entry><literal>overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 2 for 3)</literal></entry>
<entry><literal>T\\002\\003mas</literal></entry>
</row>
<row>
<entry><literal><function>position</function>(<parameter>substring</parameter> in <parameter>string</parameter>)</literal></entry>
<entry><type>int</type></entry>
@ -2682,34 +2666,6 @@
<entry><literal>3</literal></entry>
</row>
<row>
<entry><function>set_bit</function>(<parameter>string</parameter>,
<parameter>offset</parameter>, <parameter>newvalue</>)</entry>
<entry><type>bytea</type></entry>
<entry>
Set bit in string
<indexterm>
<primary>set_bit</primary>
</indexterm>
</entry>
<entry><literal>set_bit(E'Th\\000omas'::bytea, 45, 0)</literal></entry>
<entry><literal>Th\000omAs</literal></entry>
</row>
<row>
<entry><function>set_byte</function>(<parameter>string</parameter>,
<parameter>offset</parameter>, <parameter>newvalue</>)</entry>
<entry><type>bytea</type></entry>
<entry>
Set byte in string
<indexterm>
<primary>set_byte</primary>
</indexterm>
</entry>
<entry><literal>set_byte(E'Th\\000omas'::bytea, 4, 64)</literal></entry>
<entry><literal>Th\000o@as</literal></entry>
</row>
<row>
<entry><literal><function>substring</function>(<parameter>string</parameter> <optional>from <type>int</type></optional> <optional>for <type>int</type></optional>)</literal></entry>
<entry><type>bytea</type></entry>
@ -2784,7 +2740,7 @@
</entry>
<entry><type>bytea</type></entry>
<entry>
Decode binary string from <parameter>string</parameter> previously
Decode binary string from <parameter>string</parameter> previously
encoded with <function>encode</>. Parameter type is same as in <function>encode</>.
</entry>
<entry><literal>decode(E'123\\000456', 'escape')</literal></entry>
@ -2805,6 +2761,36 @@
<entry><literal>123\000456</literal></entry>
</row>
<row>
<entry>
<literal><function>get_bit</function>(<parameter>string</parameter>, <parameter>offset</parameter>)</literal>
</entry>
<entry><type>int</type></entry>
<entry>
Extract bit from string
<indexterm>
<primary>get_bit</primary>
</indexterm>
</entry>
<entry><literal>get_bit(E'Th\\000omas'::bytea, 45)</literal></entry>
<entry><literal>1</literal></entry>
</row>
<row>
<entry>
<literal><function>get_byte</function>(<parameter>string</parameter>, <parameter>offset</parameter>)</literal>
</entry>
<entry><type>int</type></entry>
<entry>
Extract byte from string
<indexterm>
<primary>get_byte</primary>
</indexterm>
</entry>
<entry><literal>get_byte(E'Th\\000omas'::bytea, 4)</literal></entry>
<entry><literal>109</literal></entry>
</row>
<row>
<entry><literal><function>length</function>(<parameter>string</parameter>)</literal></entry>
<entry><type>int</type></entry>
@ -2834,6 +2820,38 @@
<entry><literal>md5(E'Th\\000omas'::bytea)</literal></entry>
<entry><literal>8ab2d3c9689aaf18 b4958c334c82d8b1</literal></entry>
</row>
<row>
<entry>
<literal><function>set_bit</function>(<parameter>string</parameter>,
<parameter>offset</parameter>, <parameter>newvalue</>)</literal>
</entry>
<entry><type>bytea</type></entry>
<entry>
Set bit in string
<indexterm>
<primary>set_bit</primary>
</indexterm>
</entry>
<entry><literal>set_bit(E'Th\\000omas'::bytea, 45, 0)</literal></entry>
<entry><literal>Th\000omAs</literal></entry>
</row>
<row>
<entry>
<literal><function>set_byte</function>(<parameter>string</parameter>,
<parameter>offset</parameter>, <parameter>newvalue</>)</literal>
</entry>
<entry><type>bytea</type></entry>
<entry>
Set byte in string
<indexterm>
<primary>set_byte</primary>
</indexterm>
</entry>
<entry><literal>set_byte(E'Th\\000omas'::bytea, 4, 64)</literal></entry>
<entry><literal>Th\000o@as</literal></entry>
</row>
</tbody>
</tgroup>
</table>
@ -2934,7 +2952,15 @@
<literal><function>bit_length</function></literal>,
<literal><function>octet_length</function></literal>,
<literal><function>position</function></literal>,
<literal><function>substring</function></literal>.
<literal><function>substring</function></literal>,
<literal><function>overlay</function></literal>.
</para>
<para>
The following functions work on bit strings as well as binary
strings:
<literal><function>get_bit</function></literal>,
<literal><function>set_bit</function></literal>.
</para>
<para>