Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9507c8a

Browse files
committed
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 ofrelying on a SQL function.Leonardo F, reviewed by Kevin Grittner
1 parent1d1f425 commit9507c8a

File tree

13 files changed

+553
-92
lines changed

13 files changed

+553
-92
lines changed

‎doc/src/sgml/func.sgml

Lines changed: 83 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.497 2010/01/19 05:50:18 tgl Exp $ -->
1+
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.498 2010/01/25 20:55:32 tgl Exp $ -->
22

33
<chapter id="functions">
44
<title>Functions and Operators</title>
@@ -2620,7 +2620,7 @@
26202620
<entry>Return Type</entry>
26212621
<entry>Description</entry>
26222622
<entry>Example</entry>
2623-
<entry>Result</entry>
2623+
<entry>Result</entry>
26242624
</row>
26252625
</thead>
26262626

@@ -2640,32 +2640,6 @@
26402640
<entry><literal>\\Post'gres\000</literal></entry>
26412641
</row>
26422642

2643-
<row>
2644-
<entry><function>get_bit</function>(<parameter>string</parameter>, <parameter>offset</parameter>)</entry>
2645-
<entry><type>int</type></entry>
2646-
<entry>
2647-
Extract bit from string
2648-
<indexterm>
2649-
<primary>get_bit</primary>
2650-
</indexterm>
2651-
</entry>
2652-
<entry><literal>get_bit(E'Th\\000omas'::bytea, 45)</literal></entry>
2653-
<entry><literal>1</literal></entry>
2654-
</row>
2655-
2656-
<row>
2657-
<entry><function>get_byte</function>(<parameter>string</parameter>, <parameter>offset</parameter>)</entry>
2658-
<entry><type>int</type></entry>
2659-
<entry>
2660-
Extract byte from string
2661-
<indexterm>
2662-
<primary>get_byte</primary>
2663-
</indexterm>
2664-
</entry>
2665-
<entry><literal>get_byte(E'Th\\000omas'::bytea, 4)</literal></entry>
2666-
<entry><literal>109</literal></entry>
2667-
</row>
2668-
26692643
<row>
26702644
<entry><literal><function>octet_length</function>(<parameter>string</parameter>)</literal></entry>
26712645
<entry><type>int</type></entry>
@@ -2675,39 +2649,21 @@
26752649
</row>
26762650

26772651
<row>
2678-
<entry><literal><function>position</function>(<parameter>substring</parameter> in <parameter>string</parameter>)</literal></entry>
2679-
<entry><type>int</type></entry>
2680-
<entry>Location of specified substring</entry>
2681-
<entry><literal>position(E'\\000om'::bytea in E'Th\\000omas'::bytea)</literal></entry>
2682-
<entry><literal>3</literal></entry>
2683-
</row>
2684-
2685-
<row>
2686-
<entry><function>set_bit</function>(<parameter>string</parameter>,
2687-
<parameter>offset</parameter>, <parameter>newvalue</>)</entry>
2652+
<entry><literal><function>overlay</function>(<parameter>string</parameter> placing <parameter>string</parameter> from <type>int</type> <optional>for <type>int</type></optional>)</literal></entry>
26882653
<entry><type>bytea</type></entry>
26892654
<entry>
2690-
Set bit in string
2691-
<indexterm>
2692-
<primary>set_bit</primary>
2693-
</indexterm>
2655+
Replace substring
26942656
</entry>
2695-
<entry><literal>set_bit(E'Th\\000omas'::bytea, 45, 0)</literal></entry>
2696-
<entry><literal>Th\000omAs</literal></entry>
2657+
<entry><literal>overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 2 for 3)</literal></entry>
2658+
<entry><literal>T\\002\\003mas</literal></entry>
26972659
</row>
26982660

26992661
<row>
2700-
<entry><function>set_byte</function>(<parameter>string</parameter>,
2701-
<parameter>offset</parameter>, <parameter>newvalue</>)</entry>
2702-
<entry><type>bytea</type></entry>
2703-
<entry>
2704-
Set byte in string
2705-
<indexterm>
2706-
<primary>set_byte</primary>
2707-
</indexterm>
2708-
</entry>
2709-
<entry><literal>set_byte(E'Th\\000omas'::bytea, 4, 64)</literal></entry>
2710-
<entry><literal>Th\000o@as</literal></entry>
2662+
<entry><literal><function>position</function>(<parameter>substring</parameter> in <parameter>string</parameter>)</literal></entry>
2663+
<entry><type>int</type></entry>
2664+
<entry>Location of specified substring</entry>
2665+
<entry><literal>position(E'\\000om'::bytea in E'Th\\000omas'::bytea)</literal></entry>
2666+
<entry><literal>3</literal></entry>
27112667
</row>
27122668

27132669
<row>
@@ -2784,7 +2740,7 @@
27842740
</entry>
27852741
<entry><type>bytea</type></entry>
27862742
<entry>
2787-
Decode binary string from <parameter>string</parameter> previously
2743+
Decode binary string from <parameter>string</parameter> previously
27882744
encoded with <function>encode</>. Parameter type is same as in <function>encode</>.
27892745
</entry>
27902746
<entry><literal>decode(E'123\\000456', 'escape')</literal></entry>
@@ -2805,6 +2761,36 @@
28052761
<entry><literal>123\000456</literal></entry>
28062762
</row>
28072763

2764+
<row>
2765+
<entry>
2766+
<literal><function>get_bit</function>(<parameter>string</parameter>, <parameter>offset</parameter>)</literal>
2767+
</entry>
2768+
<entry><type>int</type></entry>
2769+
<entry>
2770+
Extract bit from string
2771+
<indexterm>
2772+
<primary>get_bit</primary>
2773+
</indexterm>
2774+
</entry>
2775+
<entry><literal>get_bit(E'Th\\000omas'::bytea, 45)</literal></entry>
2776+
<entry><literal>1</literal></entry>
2777+
</row>
2778+
2779+
<row>
2780+
<entry>
2781+
<literal><function>get_byte</function>(<parameter>string</parameter>, <parameter>offset</parameter>)</literal>
2782+
</entry>
2783+
<entry><type>int</type></entry>
2784+
<entry>
2785+
Extract byte from string
2786+
<indexterm>
2787+
<primary>get_byte</primary>
2788+
</indexterm>
2789+
</entry>
2790+
<entry><literal>get_byte(E'Th\\000omas'::bytea, 4)</literal></entry>
2791+
<entry><literal>109</literal></entry>
2792+
</row>
2793+
28082794
<row>
28092795
<entry><literal><function>length</function>(<parameter>string</parameter>)</literal></entry>
28102796
<entry><type>int</type></entry>
@@ -2834,6 +2820,38 @@
28342820
<entry><literal>md5(E'Th\\000omas'::bytea)</literal></entry>
28352821
<entry><literal>8ab2d3c9689aaf18 b4958c334c82d8b1</literal></entry>
28362822
</row>
2823+
2824+
<row>
2825+
<entry>
2826+
<literal><function>set_bit</function>(<parameter>string</parameter>,
2827+
<parameter>offset</parameter>, <parameter>newvalue</>)</literal>
2828+
</entry>
2829+
<entry><type>bytea</type></entry>
2830+
<entry>
2831+
Set bit in string
2832+
<indexterm>
2833+
<primary>set_bit</primary>
2834+
</indexterm>
2835+
</entry>
2836+
<entry><literal>set_bit(E'Th\\000omas'::bytea, 45, 0)</literal></entry>
2837+
<entry><literal>Th\000omAs</literal></entry>
2838+
</row>
2839+
2840+
<row>
2841+
<entry>
2842+
<literal><function>set_byte</function>(<parameter>string</parameter>,
2843+
<parameter>offset</parameter>, <parameter>newvalue</>)</literal>
2844+
</entry>
2845+
<entry><type>bytea</type></entry>
2846+
<entry>
2847+
Set byte in string
2848+
<indexterm>
2849+
<primary>set_byte</primary>
2850+
</indexterm>
2851+
</entry>
2852+
<entry><literal>set_byte(E'Th\\000omas'::bytea, 4, 64)</literal></entry>
2853+
<entry><literal>Th\000o@as</literal></entry>
2854+
</row>
28372855
</tbody>
28382856
</tgroup>
28392857
</table>
@@ -2934,7 +2952,15 @@
29342952
<literal><function>bit_length</function></literal>,
29352953
<literal><function>octet_length</function></literal>,
29362954
<literal><function>position</function></literal>,
2937-
<literal><function>substring</function></literal>.
2955+
<literal><function>substring</function></literal>,
2956+
<literal><function>overlay</function></literal>.
2957+
</para>
2958+
2959+
<para>
2960+
The following functions work on bit strings as well as binary
2961+
strings:
2962+
<literal><function>get_bit</function></literal>,
2963+
<literal><function>set_bit</function></literal>.
29382964
</para>
29392965

29402966
<para>

‎src/backend/parser/gram.y

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.704 2010/01/22 16:40:18 rhaas Exp $
14+
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.705 2010/01/25 20:55:32 tgl Exp $
1515
*
1616
* HISTORY
1717
* AUTHORDATEMAJOR EVENT
@@ -9586,9 +9586,9 @@ func_expr:func_name '(' ')' over_clause
95869586
| OVERLAY'(' overlay_list')'
95879587
{
95889588
/* overlay(A PLACING B FROM C FOR D) is converted to
9589-
*substring(A,1, C-1) || B || substring(A, C+1, C+D)
9589+
*overlay(A,B, C,D)
95909590
* overlay(A PLACING B FROM C) is converted to
9591-
*substring(A,1, C-1) || B || substring(A, C+1, C+char_length(B))
9591+
*overlay(A,B, C)
95929592
*/
95939593
FuncCall *n =makeNode(FuncCall);
95949594
n->funcname =SystemFuncName("overlay");
@@ -10150,6 +10150,7 @@ extract_arg:
1015010150
* SQL99 defines the OVERLAY() function:
1015110151
* o overlay(text placing text from int for int)
1015210152
* o overlay(text placing text from int)
10153+
* and similarly for binary strings
1015310154
*/
1015410155
overlay_list:
1015510156
a_expr overlay_placing substr_from substr_for

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp