mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Adjust bytea get_bit/set_bit to use int8 not int4 for bit numbering.
Since the existing bit number argument can't exceed INT32_MAX, it's not possible for these functions to manipulate bits beyond the first 256MB of a bytea value. Lift that restriction by redeclaring the bit number arguments as int8 (which requires a catversion bump, hence is not back-patchable). The similarly-named functions for bit/varbit don't really have a problem because we restrict those types to at most VARBITMAXLEN bits; hence leave them alone. While here, extend the encode/decode functions in utils/adt/encode.c to allow dealing with values wider than 1GB. This is not a live bug or restriction in current usage, because no input could be more than 1GB, and since none of the encoders can expand a string more than 4X, the result size couldn't overflow uint32. But it might be desirable to support more in future, so make the input length values size_t and the potential-output-length values uint64. Also add some test cases to improve the miserable code coverage of these functions. Movead Li, editorialized some by me; also reviewed by Ashutosh Bapat Discussion: https://postgr.es/m/20200312115135445367128@highgo.ca
This commit is contained in:
@ -2905,7 +2905,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
|
||||
<indexterm>
|
||||
<primary>get_bit</primary>
|
||||
</indexterm>
|
||||
<literal><function>get_bit(<parameter>bytes</parameter> <type>bytea</type>, <parameter>offset</parameter> <type>int</type>)</function></literal>
|
||||
<literal><function>get_bit(<parameter>bytes</parameter> <type>bytea</type>, <parameter>offset</parameter> <type>bigint</type>)</function></literal>
|
||||
</entry>
|
||||
<entry><type>int</type></entry>
|
||||
<entry>
|
||||
@ -2990,7 +2990,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
|
||||
<primary>set_bit</primary>
|
||||
</indexterm>
|
||||
<literal><function>set_bit(<parameter>bytes</parameter> <type>bytea</type>,
|
||||
<parameter>offset</parameter> <type>int</type>,
|
||||
<parameter>offset</parameter> <type>bigint</type>,
|
||||
<parameter>newvalue</parameter> <type>int</type>)</function></literal>
|
||||
</entry>
|
||||
<entry><type>bytea</type></entry>
|
||||
|
Reference in New Issue
Block a user